121. Best Time to Buy and Sell Stock

Posted skillking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了121. Best Time to Buy and Sell Stock相关的知识,希望对你有一定的参考价值。

一、题目

  1、审题

技术分享图片

  2、分析

    给出一个数组,让你先已 val1 买入,再 以 val2 卖出,求获得的利润最大是多少。

 

 二、解答

  1、思路: 

    方法一、

      用遍历 min 记录到当前位置的最小值;

      max 记录到当前数组值的价格卖出为止时获得的最大利润。

    public int maxProfit(int[] prices) {
        if(prices.length < 2)
            return 0;
        int min = prices[0];
        int max = 0;
        for (int i = 1; i < prices.length; i++) {
            if(prices[i] - min > 0 && prices[i] - min > max) {
                max = prices[i] - min; 
            }
            else if(prices[i] < min)
                min = prices[i];
        }
        return max;
    }

  

  优化:

    变量 minPrice 直接记录当前的最小价值。

    public int maxProfit3(int[] prices) {
        
        int minprice = Integer.MAX_VALUE, max = 0;
        for (int i = 1; i < prices.length; i++) {
            minprice = Math.min(minprice, prices[i]);
            max = Math.max(max, prices[i] - minprice);
        }
        return max;
    }

 

  方法二、

    采用 “Kadane‘s Algorithm.”,即采用求连续子串最大和的思想。

    curMax: 以当前价格卖出时获得的利润(若不赚钱就不卖出)。

      ①、若 curMax = 0, 即代表当前值比前边的值都小;

      ②、若 curMax > 0,即, curMax = (price[i-1] - price[i - 2] + price[i] - price[i-1]) = price[i] - price[i-1]。即为 当前价格为最大值,且减去的是前边的最小值。

    max: 总的过程中的最大利润。

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

 

以上是关于121. Best Time to Buy and Sell Stock的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 121. Best Time to Buy and Sell Stock

121. Best Time to Buy and Sell Stock

121. Best Time to Buy and Sell Stock

121. Best Time to Buy and Sell Stockeasy

121. Best Time to Buy and Sell Stock

121. Best Time to Buy and Sell Stock