美文网首页
121. Best Time To Buy And Sell S

121. Best Time To Buy And Sell S

作者: uzck | 来源:发表于2017-02-10 23:36 被阅读0次

    给出若干天的股价,如果只有一次买入和卖出的机会,求最大利润
    如果六天的股价为[7, 1, 5, 3, 6, 4],那么最大利润为6 - 1 = 5

    暴力解法

    双重循环,这个不用讲了,但是超时了

    找最小值

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

    这个算法的思路是在第i天买入,那么假设在未来的第j天卖掉可以获得最大值,那么如果在i到j天里我们找到一个时间k,且prices[k] < prices[i],那么最大利润将在k天买入,j天卖出达到。因此当遍历一遍数组时就可以得到最大利润

    动态规划

     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;
        }
    

    difference = prices[i] - prices[i-1]表示了每两天股票的差价,将问题转换为求连续子串的最大值,maxCur表示当前天数下的最大收益,maxSoFar表示总天数下的最大收益。 difference可能是个负数,但是只要maxCur大于0,那么表示在第i天卖出时还是赚钱的,如果求得的一个maxCur大于maxSoFar,更新maxSoFar的值

    相关文章

      网友评论

          本文标题:121. Best Time To Buy And Sell S

          本文链接:https://www.haomeiwen.com/subject/viynittx.html