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

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

  • 相关阅读:
    关键字 final
    继承中的构造方法
    方法的重写
    使用tar 和 split 将文件打包、压缩并分割成指定大小
    标准Web系统的架构分层
    Android的安全机制 1 -- 老罗
    Android 在 SElinux下 如何获得对一个内核节点的访问权限
    移动数据 流程分析
    ARM Linux 3.x的设备树(Device Tree)
    如何分析Android的Log
  • 原文地址:https://www.cnblogs.com/Sherlockmmc/p/11449412.html
Copyright © 2020-2023  润新知