给定一个数组, 它的第 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.
----------------------------------------------
这题很简单, 不要想复杂.
一开始可能会因为 "不能同时参与多笔交易" 这样的话误导, 觉得必须分析极大值点否则会出错, 其实不用. 因为题设没有区分多笔交易与单笔交易在输出上的区别, 只要去挨个数增长区间 (按天计算) 即可, 如果题目改成需要限定买入 / 卖出次数, 则可考虑用 DP 或分治求解.
- class Solution(object):
- def maxProfit(self, prices):
- """
- :type prices: List[int]
- :rtype: int
- """
- i = j = 1
- benefit = 0
- list_len = len(prices)
- # boundary checking:
- if list_len <2:
- return 0
- # record each assending in the array
- for j in range(0, list_len-1):
- if prices[j+1]> prices[j]:
- benefit += prices[j+1] - prices[j]
- return benefit
来源: http://www.bubuko.com/infodetail-2651290.html