思路一: 双层循环处理,第一层循环拿当前元素与后面的所有元素进行比较,直到拿到比它大的值,然后通过两个元素的下标计算出两个元素相差的位置也就是下一个更高温度出现在几天后。直到遍历所有的元素位置。
思路二:通过空间来换时间,减少遍历次数。引入一个栈,这个栈存储元素的索引位置。遍历数组中的元素,如果当前元素比栈顶元素小就将当前元素的索引入栈;如果当前元素比栈顶元素大,那么将栈顶元素出栈,计算两个元素的索引距离,出栈的这个元素就得到了比他高的温度的值。
/**
* @param {number[]} temperatures
* @return {number[]}
*/
var dailyTemperatures = function (temperatures) {
let len = temperatures.length
let ans = new Array(len).fill(0)
let stack = []
for (let i = 0; i < len; i++) {
while (stack.length && temperatures[i] > temperatures[stack[stack.length - 1]]) {
// 栈顶元素出栈
let temp = stack.pop()
// 当前元素与栈顶元素位置差
ans[temp] = i - temp
}
stack.push(i)
}
return ans
};
let temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
console.log(dailyTemperatures(temperatures))
单调栈问题通常解决无序数组按一定条件进行遍历相关的问题。通常将多层循环使用单调栈一次循环就可以解决。