FTPrep, 121 Best Time to Buy and Sell Stock

这道题,我想得比较细,也就是把优化的步骤都想好了。另外一些解法是套路模版,就是local 和 global两个变量来进行 不断交互比较。所以没有忽略一些可以忽略的情况。哪种模版的情况再处理复杂问题,即可以优化的情况不是很明显的题型时还是比较powerful的。

和下一道题目对比的话,这里只限买卖一次,下一道是买卖多次,多次的话就是 逢低就卖,再一这个低价买入,交易就发生在低价出现之前。有了这个high level的逻辑,代码就好写了。

代码如下:

class Solution {
    public int maxProfit(int[] prices) {
        int len=prices.length;
        if(len==0) return 0;
        int profit=0;
        int low=prices[0];
        int high=prices[0];
        for(int day=0; day<len; day++){
            if(prices[day]<low){
                low=prices[day];
                high=prices[day];
            }
            else if(prices[day]>high){
                high=prices[day];
                profit=Math.max(profit,high-low);
            }
        }
        return profit;
    }
}

// 相比之前的代码,我这个快多了,代码更多但是判断的条件更加明确,而不是没遇到一个elem就要进行min和max的更新。
// 就把把这array想象成股票价格图中的bar,无非就是找到从左到右方向上的 最小值 到 最大值的 差距。
// 而且题意给得很清楚,最小值就是0,当天买卖,所以min和max就都可以 从第一天的开始。
// 如果比high高,才有必要update:high & profit,在low和high之间,没有必要update。
// 如果比low低,那么就要update low,同时以为着之前的low所对应的最大profit已经终结。之后判断的都是以新的low为基准来进行的比较。high也更新了,然后profit不用更新。
// 总结一下,前几次提交的code,看看现在的思路为什么又快又好。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值