【LeetCode刷题】NO.35---第739题

72 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一.题目

739. 每日温度 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1:

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

示例 2:

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3:

输入: temperatures = [30,60,90]
输出: [1,1,0]

提示:

  • 1 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100

二、思路分析:

这道题目咋一看说了很多温度的话题,其实实际上就是求解当前元素的下一个较大元素的问题,但是这道题与我写过的前面两篇文章的题目有所不同,它输出的结果是天数的间隔,这个时候我们就可以利用索引进行求解。

但是如果我们的单调栈是关于数组元素的单调栈的时候,利用indexOf寻找它的索引有一个问题:那就是如果数组里面存在相同的元素的时候,你查找它的元素索引永远是第一目标值的索引,这不符合我们的预期,所以我们需要做出改变。

此时我们需要将单调栈内的元素换成数组的下标,然后每次循环中的元素栈顶的元素代表的数组数值进行比较,如果循环中的元素大,那么弹出栈顶元素直到栈内的元素代表的数组数值大于这次循环中的元素即可。结果也是通过数组下标相减得出间隔天数。

image.png

三、代码:

/**
 * @param {number[]} temperatures
 * @return {number[]}
 */
var dailyTemperatures = function(temperatures) {
    let answer = []
    let stack = []
    for(let i=temperatures.length-1 ; i>=0 ; i--){
        while(stack.length && temperatures[stack[stack.length-1]] <= temperatures[i]){
            stack.pop()
        }
        answer[i] = stack.length?stack[stack.length-1] - i:0
        stack.push(i)
    }
    return answer
};

四、总结:

起初这道题我以为还是跟上面两道题的代码几乎一致,但是发现压入栈中的是元素的话我们用indexOf不能够得到我们想要的元素的索引(数组中有相同元素),所以最终还是改成了栈内元素是它在数组中的索引。从这道题我们学会了具体问题具体分析,不能一味的套公式代码。