FTPrep, 122 Best Time to Buy and Sell Stock II

思路和121 是一样的,这里的变化是可以多次交易。所以只要遇到比当前价格低的股价时,就立马交易,然后买入这个低股价,同时跟新low,high,当前次的profit

这个也是优化过的结果,而不是用local + global哪种模版套用。但是在下一题模版会比较有用,因为很难优化,条件比较复杂,是动态的,比如说是K次。121-123这三道题连贯性不错,从个例出发,慢慢到generalized form。这符合我总结题目的思路。

代码如下:

class Solution {
    public int maxProfit(int[] prices) {
        int len= prices.length;
        if(len==0) return 0;
        int lowPrice=prices[0];
        int highPrice=prices[0];
        int profit=0;
        int totalProfit=0;
        for(int day=0; day<len; day++){
            if(prices[day]>highPrice){
                highPrice=prices[day];
                profit=highPrice-lowPrice;
            }
            else if(prices[day]<highPrice){
                totalProfit+=profit;
                profit=0;
                lowPrice=prices[day];
                highPrice=prices[day];
                
            }
        }
        totalProfit+=profit; // the last transaction has to be added as well.
        return totalProfit;
    }
}


// 和上一题一样的思路,只需要多一个totalProfit 把每次的profit都加起来就可以,什么时候加?在遇到新的lowPrice之前。
// 以上的思路是有偏差的,为什么?因为如果出现 【1,6, 2, 8】,最大交易是两次的加和:(6-1)+(8-2)=13; 而不是单次的最大单词交易额(8-1)。
// 买股票的题型这两道很有关联,单词交易最大profit,和多次交易最大收益。上面的1628的例子就是个最典型的例子说明两者的差别。zigzag shape


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值