每日温度
- https://leetcode.cn/problems/daily-temperatures/description/
描述
- 给定一个整数数组 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 <= 1 0 5 10^5 105
- 30 <= temperatures[i] <= 100
Typescript 版算法实现
1 ) 方案1:暴力
function dailyTemperatures(temperatures: number[]): number[] {
const length = temperatures.length;
const ans: number[] = new Array(length).fill(0);
const next: number[] = new Array(101).fill(Number.MAX_SAFE_INTEGER);
for (let i = length - 1; i >= 0; --i) {
let warmerIndex = Number.MAX_SAFE_INTEGER;
// 查找比当前温度高的最小索引
for (let t = temperatures[i] + 1; t <= 100; ++t) {
if (next[t] < warmerIndex) {
warmerIndex = next[t];
}
}
// 如果找到了比当前温度高的温度,计算天数差
if (warmerIndex < Number.MAX_SAFE_INTEGER) {
ans[i] = warmerIndex - i;
}
// 更新当前温度的最新索引
next[temperatures[i]] = i;
}
return ans;
}
2 )方案2:单调栈
function dailyTemperatures(temperatures: number[]): number[] {
const length = temperatures.length;
const ans: number[] = new Array(length).fill(0);
const stack: number[] = []; // 使用数组模拟栈
for (let i = 0; i < length; i++) {
const temperature = temperatures[i];
// 当栈不为空且当前温度大于栈顶索引对应的温度时
while (stack.length > 0 && temperature > temperatures[stack[stack.length - 1]]) {
const prevIndex = stack.pop()!;
ans[prevIndex] = i - prevIndex;
}
// 将当前索引压入栈中
stack.push(i);
}
return ans;
}