給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
設計一個算法來計算你所能獲取的最大利潤。你可以儘可能地完成更多的交易(多次買賣一支股票)。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
解法一:
profit記錄總利潤,a記錄一次買賣的利潤。
- 如果第二天的價格比第一天低,則在第一天將股票賣出,並計算之前的總利潤。
- 繼續遍歷,如果第二天的價格比第一天高,則在第一天買入股票,接着如果第三天的價格比第二天的價格還高,則不賣出,繼續持有股票,並計算此時的利潤。如果第三天的價格比第二天低,則進行上一步的操作。
注意:
整個思路的關鍵是第二天減去第一天的價格是虧本還是盈利。並根據是否盈利選擇是否買賣股票。
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
profit=0
a =0
for i in range(len(prices)-1):
if prices[i+1] - prices[i]<0:
profit +=a
a=0
else:
a += prices[i+1] - prices[i]
profit += a
return profit
解法二:
解法二相對於解法一,最大的不同是不記錄連續的利潤值,解法二隻記錄谷值和峯值的差來計算利潤,而解法一,是連續記錄盈利值。
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
i = 0
profit = 0
while( i < len(prices)-1):
while(i < len(prices)-1 and prices[i] >= prices[i+1]): # 尋找谷底
i +=1
valley = prices[i]
while(i < len(prices)-1 and prices[i] <= prices[i+1]): #尋找鄰近的峯頂
i +=1
peak = prices[i]
profit += peak-valley
return profit
解法一和解法二本質上是一樣。