LeetCode刷题挑战-javascript:121.买卖股票的最佳时机

301 阅读1分钟

image.png

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。

题目

给定一个数组 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

解题思路

方法一:暴力破解

看到题目首先就想到了最简单的暴力破解法代码如下:

var maxProfit = function(prices) {
    let left = 0, right =0
    let res = 0
    while(left < prices.length-1){
        right = left + 1
        while(right < prices.length){
            if(prices[left] <= prices[right]){
            ans = prices[right] - prices[left]
            res = Math.max(ans, res)
            }
            right++
        }
        left++
    }
    return res
};

方法二:贪心

每一处卖出点的最佳时机都可以做一次判定

是与前一处卖出点相同还是有了更高卖点或更低买点

判断此点是否比买点更低或比卖点更高,更新买卖点,得到的最大差值即位最大收益

var maxProfit = function(prices) {
    let min = prices[0]
    let max = 0
    for (let price of prices) {
            max = Math.max(max, price - min)
            min = Math.min(price, min)
        }
        return max
};

方法三:单调递减栈

维护一个单调递减栈

当出现比栈顶大的元素(价位)时,判定一次max,不将此元素加入栈

只有更小的元素会入栈,即为实时最低买入点,和贪心的思想差不多

var maxProfit = function(prices) {
    const stack = new Array()
    let max = 0
    for(let i = 0; i < prices.length; i++){
        if(stack.length != 0 && prices[i] > stack[stack.length - 1]){
            ans = prices[i] - stack[stack.length - 1]
            max = Math.max(ans, max)
            continue
        }
        stack.push(prices[i])
    }
    return max
};

结束语

这里是小葵🌻,只要把心朝着太阳的地方,就会有温暖~

让我们一起来攻克算法难关吧!!