这题不敢说完全懂了。只能看看别人的代码研究研究思路
先贴在这里,todo
class Solution {
public int maxProfit(int[] prices) {
if(prices==null || prices.length==0)
return 0;
int[] local = new int[3];
int[] global = new int[3];
for(int i=0;i<prices.length-1;i++)
{
int diff = prices[i+1]-prices[i];
for(int j=2;j>=1;j--)
{
local[j] = Math.max(global[j-1]+(diff>0?diff:0), local[j]+diff);
global[j] = Math.max(local[j],global[j]);
}
}
return global[2];
}
}
// 这题没有完全懂,就是没懂。
// 虽说local 和 global这里是 1维 array,实际上是 一个2D的,是因为dp算法只依赖上一列的数值,所以不断的over write,可以节省空间资源。
// local是说最后一次交易一定算在里面,也就是说一定在最后一天卖出手头的股票。
// global是说整个范围内,一定次数的交易次数后的最大值。
// 这样的话,来理解下两个 变量的更新:
// local[j] = Math.max(global[j-1]+(diff>0?diff:0), local[j]+diff);
// 括号里的是两种情况:1,最后一次交易就是倒数第二天买入,最后第一天卖出,所以这次交易是单独存在的,然后加上global里[j-1]的最优值即可;2,最后一次diff的买点是倒数第二天之前的,所以把最后一天的加上去即可,也就是说是local[j]的一次延续。
// global[j] = Math.max(local[j],global[j]);
// 括号里的两种情况,就是包含了最后一天卖掉股票的交易,和没有包含的这两种情况:1,就是刚刚更新的local[j]; 2,就是之前就有的 global[j] 不涉及最后一天卖掉股票的这个交易。