最大子数列问题 - LC121 Best Time to Buy and Sell Stock

这个问题实际上是 Kadane's Algorithm 算法问题,但我觉得也可以理解为两个常量的动态比较问题。

我的实现方法如下

    public int maxProfit(int[] prices) {
        if(prices.length < 2) return 0;
        int purchasePrice = prices[0];
        int profit = 0;
        for(int i = 1; i< prices.length; ++i){
            //确定每次比较新价格的时候拿到profit是最大的
            profit = Integer.max(profit, prices[i] - purchasePrice); 
            //确定每次比较新价格的时候买入价是最小的(即找到小的数字就不会再管前面的数字了,因为前面的最大利益以及算出来的)
            purchasePrice = Integer.min(purchasePrice, prices[i]); 
        }
        return profit;
    }

正规实现方法如下

    public int maxProfit(int[] prices) {
        int maxCur = 0, maxSoFar = 0;
        for(int i = 1; i < prices.length; i++) {
            maxCur = Math.max(0, maxCur += prices[i] - prices[i-1]);
            maxSoFar = Math.max(maxCur, maxSoFar);
        }
        return maxSoFar;
    }

Java8 的简化写法

int min = Integer.MAX_VALUE;
public int maxProfit(int[] prices) {
    return Arrays.stream(prices).map(i -> i - (min = Math.min(min, i))).max().orElse(0);
}

参考
https://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E5%AD%90%E6%95%B0%E5%88%97%E9%97%AE%E9%A2%98

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【Aipm引导页】 https://58976235.wodemo.net/down/20170514/44034...
    Mr_洛寒阅读 7,751评论 3 5
  • (开始) (标题)iApc(/标题)(链接)https://duming666.wodemo.net/down/2...
    独名阅读 5,646评论 1 3
  • ## 2015.06.05 - [开源利弊浅谈 - 张超耀](移动组周技术分享总结#开源利弊浅谈---张超耀) -...
    XcodeYang阅读 5,342评论 1 3
  • 近两年,随着互联网势头的突飞猛进,共享单车横空出世了,不得不承认的是,它的出现再一次刷新了我们对科技领域的...
    大大家的阅读 1,618评论 0 0
  • 我也不曾察觉什么时候爱上了她。我也不曾知晓到底从她那里得了什么益处或受了什么魅惑,只是就这样爱上了她。我本是...
    房如一阅读 1,579评论 2 1