LCR 038.每日温度
请根据每日 气温
列表 temperatures
,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 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
法1:暴力
分析:
最后一个元素的结果一定是0,因为他后面没有元素,所以i的遍历范围可以写为i < temperatures.length - 1
,所以结果数组填充0.
两层循环,第一个遍历元素,第二个循环找比当前元素大的数的下标j,如果找到了,就令result[i] = j - i
,如果没找到,就设置为0.
时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n)
var dailyTemperatures = function(temperatures) {
let result = new Array(temperatures.length).fill(0);
for (let i = 0; i < temperatures.length - 1; i++) {
const t = temperatures[i];
let j = i + 1;
let flag = true;
while(j < temperatures.length){
if(t < temperatures[j]) break;
else if(j === temperatures.length - 1 && t >= temperatures[j]) flag = false;
j++;
}
result[i] = flag ? j - i : 0;
}
return result;
};
法2:栈
分析:
定义一个stack,遍历temperatures,默认直接入栈,如果找到大于栈顶下标的值的数,就将起始的i下标出栈,并将结果存一下result[pre] = i - pre
。
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
var dailyTemperatures = function(temperatures) {
let result = new Array(temperatures.length).fill(0);
let stack = [];
for (let i = 0; i < temperatures.length; i++) {
const t = temperatures[i];
const top = stack.length - 1;
while(stack.length > 0 && t > temperatures[stack[top]]){
// 找到大于i下标元素的值,就将上一个数的下标出栈
let pre = stack.pop();
result[pre] = i - pre;
}
stack.push(i); // 下标入栈
}
return result;
};