public int maxProfit(int[] prices) {
/*
global[i][j]: i days, j transactions
local[i][j]: i days, j transactions, the last is complete at the last day
global[i][j]=max(local[i][j],global[i-1][j]),
local[i][j]=max(global[i-1][j-1]+diff,local[i-1][j]+diff)
*/
if(prices==null || prices.length==0)
return 0;
int[] local = new int[3];
int[] global = new int[3];
for(int i=1;i<prices.length;i++)
{
int diff = prices[i]-prices[i-1];
for(int j=2;j>=1;j--)
{
local[j] = Math.max(global[j-1]+diff, local[j]+diff); //(diff>0?diff:0)
global[j] = Math.max(local[j],global[j]);
}
}
return global[2];
}
Node: for local[i][j] , the last transaction's buy time can either be day [j-1], or some day before that. for the former one,
local[i][j]=global[i-1][j-1]+diff
for the latter one, it is equivalent that j transaction happened in i-1 days and the last selling time is day i-1, and one more transaction is to buy at day i-1 and sell it at day i, namely, the last two transaction can be merged into one.
since local and global only depends on previous day, the space is depends on the max number of transactions. Since local[j] depends on global[j-1], in order not to impact the values, the variable j must decrease.