[leetcode-python3] 121. Best Time to Buy and Sell Stock
121. Best Time to Buy and Sell Stock - python3
Say you have an array for which the ith element is the price of a given stock on day i.
If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.
Note that you cannot sell a stock before you buy one.
My Answer 1: Wrong Answer
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if not prices:
return 0
mn = min(prices, default=0)
mx = max(prices, default=0)
if mn == mx:
return 0
mn_idx = 0
mx_idx = 0
for i in range(0, len(prices)):
if prices[i] == mn:
mn_idx = i
if prices[i] == mx:
mx_idx = i
if mn_idx <= mx_idx:
return mx - mn
mx2 = mn
mn2 = mx
for i in range(mn_idx, len(prices)):
if mx2 < prices[i]:
mx2 = prices[i]
for i in range(0, mx_idx):
if mn2 > prices[i]:
mn2 = prices[i]
if mx2 - mn > mx - mn2:
return mx2 - mn
else:
return mx - mn2
처음 생각한 것:
1) min 값이 max 값보다 앞에 있으면 return max - min
2) 아닐 경우,
- min 뒤에 있는 값들 중 최대값 max2 를 찾아 max2 - min ,
- max 앞에 있는 값들 중 최소값 min2 를 찾아 max - min2
를 구해서 둘이 비교 -> 더 큰 값을 return
문제점: input = [7,2,4,1] 과 같이 양극에 max, min이 있을 경우
=> 중간(2,4)에서의 profit 이라도 구해야하는데 그러지 않음
max min 이 고정되면 안되는 것 같다.. 나무말고 숲을 보자
(왜인진 모르지만 min(), max() arg is an empty sequence 오류가 나서 각 함수마다 default 값을 지정해줌)
두번째 생각한 것:
buy 와 sell 변수 사용하기
일단 prices[0] 부터 무조건 buy 로
-> buy 보다 작은 값이 나오면 buy = prices[i] ...이렇게 대충 해보면 될 거 같은데 sell 을 어떻게 처리할지 모르겠음 ㅠㅠ
파이썬이 C언어화 되어가는 모습에 눈물이 나고..
머리가 그대로 굳었다.................................☆
Other Answer 1: (Runtime: 60 ms / Memory Usage: 15.1 MB)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
num_days = len(prices)
output = 0
min_price = sys.maxsize
for i in range(num_days):
if prices[i] < min_price:
min_price = prices[i]
output = max(output, prices[i] - min_price)
return output
찾아보니 아무 값(prices[i])에서 최소값(min_price)을 뺀 값 中 최대값을 구하면 되는 간단한 문제였다;
이때 최소값 min_price 는 리스트를 순회하며 계속 바뀔수있음
이게 베스트 코드 같다고 생각
My Answer 2: Accepted (Runtime: 64 ms / Memory Usage: 15.1 MB)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if not prices:
return 0
buy = prices[0]
sell = 0
maxprofit = 0
for i in range(1, len(prices)):
if buy > prices[i]:
buy = prices[i]
else:
sell = prices[i]
maxprofit = max(maxprofit, sell - buy)
return maxprofit
Other Answer 1을 기반으로
아까 두번째로 생각했던 buy 와 sell 변수를 이용해본것.
buy 는 최소값의 역할을 한다.
buy 값보다 큰 값이면 계속 팔고 보기 -> 그 profit 들 中 최대값이 maxprofit
Author And Source
이 문제에 관하여([leetcode-python3] 121. Best Time to Buy and Sell Stock), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jsh5408/leetcode-python3-121.-Best-Time-to-Buy-and-Sell-Stock저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)