Const
要寻找右边第一个比当前温度更高的温度,维持一个递减的单调栈。
当遍历到的元素大于栈顶元素时:
当遍历到的元素小于等于栈顶元素时:
继续遍历:
通过单调栈维护一个从栈底到栈顶单调递减的序列。
function dailyTemperatures(temperatures: number[]): number[] {
// 由于需要求相对间隔天数,我们在s中存放下标而不是存放具体元素。具体元素可以通过temperatures[i]得到
const n = temperatures.length;
const s: number[] = []; // 我们让栈从栈底到栈顶维持单调递增
const ans: number[] = new Array(n).fill(0); // 按照题意创建n个位置,每个位置默认0,代表如果右边没有比当前位置更大的第一个数。
// 从左往右,逐步查看每个数
for (let i = 0; i < n; i++) {
// 如果栈空,我们放入当前数
if (s.length === 0) {
s.push(i);
}
else {
// 否则栈不为空,如果我们要放入当前数,那么为了维持单调递减,我们需要不断查看栈顶元素:
// 栈顶元素如果总是比当前数小,那么就出栈
// 最后我们放入当前数,这样一来栈维持单调递减。
// 由于栈里总是保持着没找到右边第一个比自己大的数,那么当我们能够出栈就代表我们看到了比栈顶数更大的第一个数了。于是我们记录结果
while (temperatures[s[s.length - 1]] < temperatures[i]) {
const j = s.pop()!;
ans[j] = i - j;
}
s.push(i);
}
}
return ans;
};
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 <= 10^5
30 <= temperatures[i] <= 100