题目
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
解题思路
这道题一开始我还自信满满的以为是找到多个数值处于连续上升的子数组,然后将每一段子数组的最高值减去最低值的差值进行求和,然后就开始啪啪啪写代码,虽然完成了,速度也不慢,但是代码非常复杂,还需要判断什么情况下,一个连续上升的子数组结束。还修改了几次提交代码才完成。
详见答案(一)
然后提交以后,看了一下执行速度最快的代码,短短几行就解决了,此时才发现自己的解题思路还是有问题。
此题虽然说是买卖股票,一次买一次卖,比如1,2,3,4,5的情况下,在1买入,5卖出,收益是4;但实际上,也可以看成 (2-1) + (3-2) + (4-3) + (5-4) = 4.
也就是说,这道题可以直接看成,如果后面的数比前面大,就在总的结果上,加上这个差值。
详见答案(二)
答案(一)
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if prices == []:
return 0
last_price = prices[0]
h_price = 0
l_price = prices[0]
find_l = True
result = 0
for price in prices:
if price < last_price:
if find_l:
l_price = price
else:
result = result + h_price - l_price
l_price = price
find_l = True
elif price > last_price:
h_price = price
if find_l:
find_l = False
last_price = price
if not find_l:
result = result + h_price - l_price
return result
答案(二)
class Solution(object):
def maxProfit(self, prices):
profit = 0
for day in range(len(prices)-1):
differ = prices[day+1] - prices[day]
if differ > 0:
profit += differ
return profit