Problem: 122. 买卖股票的最佳时机 II
思路
非贪心:
- 每天的股价有三种状态,即[谷点]、[上升]、[降低],但在此题上和原版买卖股票leetcode121不一样的是:
- 我们可以不停的买卖也就是说[谷点]和[下降]状态是[等同]的
- [谷点+下降]的时候不仅需要重置最小值,结果值还要加上上一段区间
- [上升]的时候需要持续不断的更新区间值,但有个[例外]:如果最后一次区间是上升就永远都不会被下一次下降所收回,所以需要额外注意是否为最后一次收集
贪心:
- 基于目前情况做最佳选择,不考虑后果
- 即不断的卖出股票,直到遇到股价降低,此时重新开始计算即可
解题方法
见注释
复杂度
略
Code
非贪心:
public static class Solution {
public int maxProfit(int[] nums) {
int max = 0;
int min = Integer.MAX_VALUE;
int result = 0;
for (int i = 0; i < nums.length; i++) {
//股价上升
if(nums[i]-min >= max){
//如果股价还在上升则更新最大区间
max = nums[i]-min;
//如果最后一次收集是持续增加的就需要手动收集一次
if(i==nums.length-1){
result += max;
}
}else{
//股价降低
//加上上一段区间
result += max;
//重置区间值,准备重新计数
max = 0;
//重置最小值,准备重新计数
min = nums[i];
}
}
return result==0?max:result;
}
}
贪心:
public int maxProfit_2(int[] nums) {
int result = 0;
for (int i = 0; i < nums.length-1; i++) {
if(nums[i] < nums[i+1]) result += nums[i+1] - nums[i];
}
return result;
}