给定一个数组,它的第 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
解法一和解法二本质上是一样。