学习目标:
分享寒假每日刷的算法题,冲击4月蓝桥杯!!冲冲冲
原题:
题目描述:
请根据每日气温列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用
0
来代替。
示例一 :
输入:temperatures = [73,74,75,71,69,72,76,73]
输出:[1,1,4,2,1,1,0,0]
示例二 :
输入:temperatures = [30,60,90]
输出:[1,1,0]
题解:
思路(单调栈):
1.本题可以用纯暴力的做法解决,时间复杂度为O(n^2)。也可以用空间换时间的做法用时间复杂度为O(n)的单调栈做。
2.因为题目要确定最高温度的日子还要几天,那么我们的单调栈应该是一个单调递减栈(从栈底到栈顶)。
3.情况一:当要入栈的元素,比栈顶的元素要小或等于,直接入栈。
4.情况二:当要入栈的元素,比栈顶的元素要大,就将栈顶弹出,知道栈顶元素大于入栈元素或是栈内没有元素,再执行入栈操作
5.在栈弹出的同时进行对最近最高温度的标记
代码实现 (Python):
class Solution:
def dailyTemperatures(self, temperatures):
stack = [] #创建单调栈
ans = [0 for i in range(len(temperatures))]
for i in range(len(temperatures)):
if not stack or temperatures[stack[-1]] >= temperatures[i]:
stack.append(i) #栈中存放元素下标,方便计算天数的差值
else:
while stack and temperatures[stack[-1]] < temperatures[i]: #弹出
n = stack.pop()
ans[n] = i - n
stack.append(i)
return ans