每日温度
- 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;
}