LeetCode Problem 122-Best Time to Buy and Sell Stock II

买卖股票的最佳时机 II。给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

1
2
3
4
输入: [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
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

1
2
3
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

思路一

寻找股票的波峰波谷,波谷时买入,波峰时卖出,时间复杂度 \(O(n)\)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if not prices:
            return 0
        buy = sell = prices[0]
        rs = i = 0
        while i < len(prices) - 1:
            while i < len(prices) - 1 and prices[i] >= prices[i+1]:
                i += 1
            buy = prices[i]
            while i < len(prices) - 1 and prices[i] <= prices[i+1]:
                i += 1
            sell = prices[i]
            rs += sell - buy
        return rs

值得注意的是,如果仅仅是为了求得最大收益,则可以通过下面的手段,但是失去了题目本身想要表达的意思。

1
2
3
4
5
6
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        rs = 0
        for i in range(len(prices) - 1):
            rs += max(0, prices[i+1] - prices[i])
        return rs

相似问题

  1. Best Time to Buy and Sell Stock
  2. Best Time to Buy and Sell Stock III
  3. Best Time to Buy and Sell Stock IV
  4. Best Time to Buy and Sell Stock with Cooldown
  5. Best Time to Buy and Sell Stock with Transaction Fee
此时不赞何时赞!