单调栈
了解单调栈先要了解栈。栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。所以它是一种后入先出(LIFO)的数据结构。
而单调栈是一种单调递增或单调递减的栈,跟单调队列差不多,但是只用到它的一端。
每日温度
题目描述
给定一个整数数组 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
python代码
class DailyTemperature(object):
def dailyTemperatures(self, temperatures: list) -> list:
"""
:type temperatures: List[int]
:rtype: List[int]
"""
length = len(temperatures)
if length <= 0:
return []
if length == 1:
return [0]
# res用来存放第i天的下一个更高温度出现在几天后
res = [0] * length
# 定义一个单调栈
stack = []
for index in range(length):
current = temperatures[index]
# 栈不为空 且 当前温度大于栈顶元素
while stack and current > temperatures[stack[-1]]:
# 出栈
pre_index = stack.pop()
# 当前索引和出栈索引差即为出栈索引结果
res[pre_index] = index - pre_index
stack.append(index)
return res
if __name__ == "__main__":
demo = DailyTemperature()
temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
print(demo.dailyTemperatures(temperatures))
该题目是把索引和温度绑定一起入栈出栈,按照温度降序入栈,出栈之差即距离当天第几天升温。