单调栈
了解单调栈先要了解栈。栈(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_indexstack.append(index)return resif __name__ == "__main__":demo = DailyTemperature()temperatures = [73, 74, 75, 71, 69, 72, 76, 73]print(demo.dailyTemperatures(temperatures))
该题目是把索引和温度绑定一起入栈出栈,按照温度降序入栈,出栈之差即距离当天第几天升温。