前言
记录一下算法的学习
题目描述
给定一个整数数组 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 <= 105
30 <= temperatures[i] <= 100
暴力解法
根据题意,可以得到,只要算出最近一天比当前天温度高相差的天数,此天数作为当前下标的值。可以使用暴力双层循环来解决问题
const dailyTemperatures = (temperatures) => {
const len = temperatures.length;
const arr = new Array(len).fill(0)
for(let i = 0; i < len; i++ ){
for(let j = i + 1; j < len; j++ ) {
if(temperatures[j] > temperatures[i]) {
arr[i] = j - i
break;
}
}
}
return arr
}
单调栈
根据题意,每一项只需要求得下一个比它大的数。而只要计算任意数右边或者左边第一个比它的数时候,可以使用单调栈来解答
这里以temperatures[73,74,75,71,69,72,76,73]
为例
- 取出
第0项73
将下标存入栈中,此时栈内为 [0] - 取出
第1项74
查看栈顶,此时74 > temperatures[0],说明升温,将栈顶项取出,计算两者差值作为栈顶下标0升温天数为 1 - 0 = 1,并且将第1项
下标放入栈顶,此时栈内为 [1] - 取出
第2项75
,查看栈顶,此时75 > temperatures[1],说明升温,将栈顶项取出,计算两者差值作为栈顶下标1升温天数为2 - 1 = 1,并且将第2项
下标放入栈顶,此时栈内为 [2] - 取出
第3项71
,查看栈顶,此时71 < temperatures[2],说明降温,将第3项
下标放入栈顶,此时栈内为 [2,3] - 取出
第4项69
,查看栈顶,此时69 < temperatures[3],说明降温,将第4项
下标放入栈顶,此时栈内为 [2,3,4] - 取出
第5项72
,查看栈顶,此时72 > temperatures[4],说明升温,将栈顶项取出,计算两者差值作为栈顶下标4的升温天数 5 - 4 = 1。此时栈顶为3,此时72 > temperatures[3],将栈顶项取出,计算两者差值作为栈顶下标3的升温天数 5 - 3 = 2。此时栈顶为2,此时72 < temperatures[2], 将第5项
下标放入栈顶,此时栈内为 [2,5] - 取出
第6项76
,查看栈顶,此时76 > temperatures[5],说明升温,将栈顶项取出,计算两者差值作为栈顶下标5的升温天数 6 - 5 = 1。此时栈顶为2,此时76 > temperatures[2],将栈顶项取出,计算两者差值作为栈顶下标2的升温天数 6 - 2 = 4。此时栈顶为空 将第6项
下标放入栈顶,此时栈内为 [6] - 取出
第7项73
,查看栈顶,此时73 < temperatures[6],说明降温, 将第7项
下标放入栈顶,此时栈内为 [6,7] - 全部遍历完成后,站内剩余的下标不存在升温天数,为0。
- 最终得出结果
[1,1,4,2,1,1,0,0]
const dailyTemperatures = (temperatures) => {
const len = temperatures.length;
const stack = [0]; // 用数组模拟栈,先入栈0
const arr = new Array(len).fill(0);
for(let i = 1; i< len; i++ ) {
while(arr.length && temperatures[i] > temperatures[stack[stack.length - 1]]) {
const top = stack.pop(); // 取出栈顶
arr[top] = i - top; // 计算相差天数
}
stack.push(i) // 压栈
}
return arr;
}
最后
每天进步一点点