单调栈

73 阅读1分钟

对leetcode739每日温度的一种算法实现

题目描述:

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

  示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

思路:

一、暴力法:

两次遍历 外层控制当前元素 内层来获取当前元素后面的第一个元素

二、单调栈:

自己的理解思路主要分四步:

定义一个单调递减的栈,栈内的值为温度数组每一项的下标 当遍历整个数组时,当前的元素大于栈顶的时候 将栈顶弹出 如果当前元素小于栈顶 则push到栈内 作为下一个新的栈顶 将当前的元素下标和栈顶的相减就是栈顶元素下一个温度出现天数差

var dailyTemperatures = function(temperatures) {
  
    let res = Array(temperatures.length).fill(0)
    // 定义一个单调递减的栈
    let stack = []
    // 栈的值为数组每一项的下标
    for(let i = 0; i < temperatures.length; i++) {
        let cur = temperatures[i]
        // 当新加入的元素大于栈顶的时候 将栈顶弹出
        // 将当前的元素下标和栈顶的相减就是下一个最大出现天数
        // 只要栈顶元素小于且栈不为空 就必须获取差值
        while(stack.length!==0&&cur>temperatures[stack[stack.length-1]]){
            let top = stack.pop()
            res[top] = i-top
        }
        //不管是否处理都需要入栈的操作
        stack.push(i)
    }
    return res
};