FTPrep, 123 Best Time to Buy and Sell Stock III, 没完全懂,TODO

这题不敢说完全懂了。只能看看别人的代码研究研究思路

先贴在这里,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] 不涉及最后一天卖掉股票的这个交易。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值