LeetCode 122.买卖股票的最佳时机II

122. 买卖股票的最佳时机 II

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

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

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

示例 1:

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

示例 3:

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

提示:

  • 1 <= prices.length <= 3 * 10 ^ 4
  • 0 <= prices[i] <= 10 ^ 4

思路: 怎么能得到股票的最大收益呢?

显然是低谷买,高峰卖。如下图所示: 在1买 在股价为5卖,赚得4

虽然题目说了不能在同一天买和卖,但是如连续两天都是涨,如下图所示。


第三天卖出前面两天买的股票和第二天先卖第一天的股票再买第二天的股票,最后第三天再卖出第二天的股票所得的结果是一样的,综上我们可以得到一个规律就是只要是上一天的股票比现在的股票便宜就卖出去。

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.empty()) return 0;
int ans = 0;
for (int i = 1; i < prices.size(); ++i){
ans += max(0, prices[i] - prices[i - 1]); // 后一天和前一天的差值为正数 说明赚了
}
return ans;
}
};