121. 买卖股票的最佳时机|刷题打卡

974 阅读3分钟

121. 买卖股票的最佳时机|刷题打卡

create by db on 2021-3-8 23:28:00
Recently revised in 2021-3-8 23:48:57

闲时要有吃紧的心思,忙时要有悠闲的趣味

原题链接121. 买卖股票的最佳时机 目录

题目描述

返回目录

 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:

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

示例 2:

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

提示:

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 104

思路分析

思路一:暴力遍历

 数组中两个数字的最大差值即为最大利润maxprofit

 比较差值求出max(prices[j] - prices[i]) (j > i)

  • 时间复杂度: O(n^2),循环运行n(n-1)/2次
  • 空间复杂度: O(1),只使用了常数个变量

tips:

 很遗憾,这个算法被LeetCode判为超时……

思路二:一次遍历

 📈低买高卖才能赚钱

  • 一个变量minprice存储 历史最低价
  • 一个变量max存储 最大利润

 遍历整个数组,有两种可能

  1. 当前值小于历史最低价,则更新历史最低价

  2. 当前值大于历史最低价,则取 [当前值-历史最低价]与 最大利润之间的较大值,更新 最大利润

 循环一遍就可以了

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

AC 代码

题解一:暴力遍历

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let max = 0;
    for (let i = 0; i < prices.length; i++) {
        for(let j = i + 1; j < prices.length; j++) {
            if(prices[j] > prices[i]) {
                max = Math.max(prices[j] - prices[i], max);
            }
        } 
    }
    return max;
};

题解二:一次遍历

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let minprice = prices[0]
    let max = 0
    for(let i = 0;i<prices.length;i++){
        if(prices[i]<minprice){
            minprice = prices[i]
        }else{
            max = Math.max(max,prices[i]-minprice)
        }
    }
    return max
};;

总结

返回目录

 三月你好,春暖花开。我要进大厂!加油!

 本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情

后记:Hello 小伙伴们,如果觉得本文还不错,记得点个赞或者给个 star,你们的赞和 star 是我编写更多更丰富文章的动力!GitHub 地址

文档协议

知识共享许可协议
db 的文档库db 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于github.com/danygitgit上的作品创作。
本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by… 处获得。