买卖股票的最佳时机 II
主要思路:求上升区间的高度差的累加和,对于每一个递增区间都算出来每两个之间的差值,然后累加起来
解释一下为什么要划分为一个一个的递增区间:
我们用1 3 2 10 和 1 3 3 10来对比
我们发现在图一中,有明显下滑,我们如果要求最大的利润,是第一天买入,第二天卖出,第三天买入,第四天卖出,共计3-1 + 10-2 = 10,为什么不会考虑非要在一个递增区间的开始买入和最高卖出呢,为什么不可以在下一个递增区间卖出呢,我们由图一看到第三天的下滑,那么我们计算一个区间的从低到高的差值累加就会比直接用第一天买入第四天卖出多1,这个1是由于第三天比第二天低的差值,相比于图二,我们可知,对每一个递增区间求差值累加就是我们想要的结果
实现方法:设置一个dp数组,存储从0到当前位置i中获得的最大利润,初始化第0天为0
- 如果第i天比第i-1天的价值更高,那么dp[i] = prices[i] - prices[i-1] + dp[i-1],也就是第i天i-1天多的加上前i-1天的最大,就是第i天获得的最大值
- 如果第i天比第i-1天的价值小或者相同,那么dp[i] = 0 + dp[i-1],也就是开启了一个新的递增区间,新的递增区间的第一个直接继承前i-1天的最大值就可以
- 直到全部遍历一遍,最后一个dp的元素存放的就是全局的最大利润
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
//先进行判断数组长度
if(len == 0 || len == 1){
return 0;
}
//建立额外的动态规划辅助空间,第i个元素表示前i天利润的最大值
int[] dp = new int[len];
//动态规划基本套路,初始化
dp[0] = 0;
//动态规划基本套路,遍历修改
for(int i=1;i<len;i++){
if(prices[i]<=prices[i-1]){
dp[i] = 0 + dp[i-1];
}else{
dp[i] = prices[i] - prices[i-1] + dp[i-1];
}
}
return dp[len-1];
}
}