码迷,mamicode.com
首页 > 其他好文 > 详细

121. Best Time to Buy and Sell Stock

时间:2018-10-06 23:07:20      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:+=   最大值   sel   and   最小值   time   length   png   获得   

一、题目

  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

标签:+=   最大值   sel   and   最小值   time   length   png   获得   

原文地址:https://www.cnblogs.com/skillking/p/9748895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!