题目
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
*示例 1:
输入: [7,1,5,3,6,4]
输出: 7
*示例 2:
输入: [1,2,3,4,5]
输出: 4
*
*示例 3:
输入: [7,6,4,3,1]
自己的解题思路
自己的思路首先对给定的列表进行遍历,举例如[7,1,5,3,6,4],若当前i对应的价格小于i+1的价格,则意味着低点买入,设置标记b为True,若当前i对应的价格大于i+1的价格,则意味着高点卖出,设置标记b为False。b代表是否买股票。
对应的代码如下:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
max_value = 0#代表最大利润
buy = 0#代表买入的索引位置
sell = 0#代表卖出的索引位置
b =False#代表是否买入股票
i = 0
#遍历列表
while i<len(prices):
#考虑两种情况,当i是否为列表最后一位时
if i != len(prices)-1
#判断是否买入了,如果没有买入,则在低点买入
if prices[i]<prices[i+1] and not b:
buy = i
b = True
#判断是否卖出了,如果没有卖出,则在高点卖出
elif prices[i]>prices[i+1] and b:
sell = i
if prices[sell]-prices[buy]>0:
#利润的计算
max_value = max_value + prices[sell]-prices[buy]
#已经卖出,将b置为False,买入和卖出的索引置为0
b = False
buy = 0
sell = 0
i+=1
else:
#当i为最后一位时,判断是否买入,若没买入,则i+1跳出循环,若买入则进行卖出
if b:
sell = len(prices)-1
max_value = max_value + prices[sell]-prices[buy]
i+=1
return max_value
我的代码考虑了很多种情况,显得特别臃肿,没有将各种情况进行合并。下面参照大佬的代码,感觉自己还需要多加努力。
大佬的解题思路
class Solution:
def maxProfit(self, prices: List[int]) -> int:
profit = 0
for i in range(1, len(prices)):
tmp = prices[i] - prices[i - 1]
if tmp > 0: profit += tmp
return profit
作者:jyd
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/solution/best-time-to-buy-and-sell-stock-ii-zhuan-hua-fa-ji/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
大佬的代码化繁为简,只考虑今天和明天的差价,如果差价大于0则加入最大利润,如果差价小于0则不纳入计算。