Leetcode 121.买股票的最佳时机

题目描述:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

      用很容易想到的暴力解题法,这道题很简单就能做出来,就是两层嵌套循环找出差值最大的就行了。但我看力扣官方解答还有一种很妙的方法,一次遍历就能找到结果,算法很简单但就是不容易想到。

先上暴力解法的代码:(时间复杂度为O(n^2))

       

public class Solution {
    public int maxProfit(int prices[]) {
        int maxprofit = 0;
        for (int i = 0; i < prices.length - 1; i++) {
            for (int j = i + 1; j < prices.length; j++) {
                int profit = prices[j] - prices[i];
                if (profit > maxprofit)
                    maxprofit = profit;
            }
        }
        return maxprofit;
    }
}

      力扣官方的一次遍历法:时间复杂度为O(n)

           先假设给定的数组是{6,5,1,2,9,3}

         画出图为:

          

       先找到一个最小谷底(minprice),然后继续找最大的峰,这期间如果找到比之前低的谷,就更换minprice,然后再找最高的峰值,然后比较差值是否比之前的大,如果大就替换否则就继续寻找。

   

 1 public class Pro{
 2     public int maxProfit(int prices[]) {
 3         int minprice = Integer.MAX_VALUE;
 4         int maxprofit = 0;
 5         for (int i = 0; i < prices.length; i++) {
 6             if (prices[i] < minprice)
 7                 minprice = prices[i];
 8             else if (prices[i] - minprice > maxprofit)
 9                 maxprofit = prices[i] - minprice;
10         }
11         return maxprofit;
12     }
13 }

   这道题的思想很棒,学到了。

原文地址:https://www.cnblogs.com/Sherlockmmc/p/11449412.html