Solution 1
对 0121. Best Time to Buy and Sell Stock 的变体,前者只能在整个过程中买卖一次,本题则可以买卖多次,并且可以同期完成买卖,也就是在整个过程中寻找数个不重叠(但可首尾重合)的区间,区间的首末差值最大的方案。
可以用贪心策略来实现(证明略),只要找到相邻两个有正差值就完成买卖。因为如果中间出现更高的或者更低的,这个区间的首末差值都不会是最优的。
- 时间复杂度: O ( N ) O(N) O(N),其中N为输入的长度,线性遍历一次
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态量
class Solution {
public:
int maxProfit(vector<int>& prices) {
int sum = 0;
for (int i = 1; i < prices.size(); ++i) {
if (prices[i] - prices[i - 1] > 0) {
sum += prices[i] - prices[i - 1]; // 一次正收益买卖
}
}
return sum;
}
};
Solution 2
Solution 1的Python实现
class Solution:
def maxProfit(self, prices: List[int]) -> int:
ans = 0
for i in range(1, len(prices)):
if prices[i] - prices[i - 1] > 0:
ans += prices[i] - prices[i - 1]
return ans