zoukankan      html  css  js  c++  java
  • 每日一道 LeetCode (30): 买卖股票的最佳时机

    每天 3 分钟,走上算法的逆袭之路。

    前文合集

    每日一道 LeetCode 前文合集

    代码仓库

    GitHub: https://github.com/meteor1993/LeetCode

    Gitee: https://gitee.com/inwsy/LeetCode

    题目:买卖股票的最佳时机

    题目来源:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

    给定一个数组,它的第 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。
    

    解题方案

    这道题用暴力的方式来做解答还是比较简单的,就是暴力方式的耗时比较感人。

    先在最外层做一个循环,循环整个数组,然后再在内层做一个循环,挨个和最外层的循环求差,并且保存最大的那个差值,循环完成后,返回我们刚才求出来的最大的那个差值。

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

    这个代码绝对算简单的了,这种写法让我想起了冒泡排序。。。

    然后我在 LeetCode 执行了一下这段代码,它的耗时简直超出了天际。。。。

    我这是做了什么,不就一个简单的双循环么,怎么消耗时间就上了 3 位数了,吓死我了。

    好吧,乖乖的去看答案,答案中提供了一种只循环一次就能得到结果的方案。

    但是这个答案的解释非常不好,非要将这种解法生生套到这个场景中去。

    完全没必要嘛,先看下代码,代码比较简单,看都看得懂:

    public int maxProfit_1(int[] prices) {
         int minprice = Integer.MAX_VALUE;
         int maxprofit = 0;
    
         for (int i = 0; i < prices.length; i++) {
              if (prices[i] < minprice) {
                   minprice = prices[i];
              } else if (prices[i] - minprice > maxprofit) {
                   maxprofit = prices[i] - minprice;
              }
         }
    
         return maxprofit;
    }
    

    我对这段代码的理解就是,在循环的过程中,寻找最小的值 minprice ,因为卖出价格一定在买入价格后面,所以我在循环的时候永远用当前的值去减最小的值 minprice ,从而得到 maxprofit 的值。

    扫描二维码关注「极客挖掘机」公众号!
    作者:极客挖掘机
    定期发表作者的思考:技术、产品、运营、自我提升等。

    本文版权归作者极客挖掘机和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果您觉得作者的文章对您有帮助,就来作者个人小站逛逛吧:极客挖掘机
  • 相关阅读:
    利用dockerfile定制镜像
    发布Docker 镜像到dockerhub
    Docker 停止容器
    133. Clone Graph
    132. Palindrome Partitioning II
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    127. Word Ladder
  • 原文地址:https://www.cnblogs.com/babycomeon/p/13581082.html
Copyright © 2011-2022 走看看