栈
-
【offer 09】两个栈实现队列:
- 入队:放入栈1
- 出队:从栈2出,如果栈2空,将栈1所有数放入栈2再出
-
【20】有效括号:左括号入栈,右括号与栈顶查看是否匹配
-
【32】最长有效括号:start=-1,遍历字符串左括号入栈,当遇到右括号时
-
栈空,不匹配,start=i
-
非空,pop。更新以这个右括号结束的最大匹配长度:如果pop后
- 栈空:ans = max(ans,i-start)
- 非空:ans = max(ans,i-top)
-
-
【71】简化路径:栈存放路径,遇到..就出栈,遇到//或者.直接跳过,遇到文件夹名入栈
单调栈
解决数组中每个数左边第一个比他小的数是多少
-
【84】直方图最大矩形面积:枚举每一个柱子,求以此为高的矩形的面积
- 矩形的长就是这个高度左右可以到达的长度,可以分两次用单调栈求解。例如求左连续长度:从左向右枚举,维护一个单调递增的栈,更新长度即可
- 另一种方法:出栈时相当于找到了出栈这个位置的右边界,减少一次遍历
-
【155】最小栈:对于minst:push时,小于等于top入栈,pop时,等于就pop
-
【739】每日温度:右向左枚举,维护一个递减栈,每次插入前看一个右边第一个比自己大的数是多少
-
【239】滑动窗口最大值:
- 维护一个单调递增队列,每次依次判断是否出队(左窗口右移)、pop再push,窗口最大值为Top
-
【224】基本计算器:遍历字符串:
- 遇到数字,抠出来放到nums数组
- 遇到左括号,放入cal数组
- 遇到右括号,不断运算,直到遇到左括号,再把左括号弹出
- 遇到运算符,维护一个递增的单调栈,栈内有优先级更高的就先运算
- 同【277】基本计算器 II
-
【456】132 模式:先记录前缀最小值,再从右向左枚举建立单调栈:遇到更大的数,就判断132模式并出栈
-
【offer 30】包含min函数的栈:维护一个单调栈
队列
单调队列
-
【offer 59】滑动窗口的最大值:维护一个递减的单调队列
- 入队:删除队里所有小于本值的数
- 当淘汰的数与队左边的数相同时,淘汰最左的数
- 求最大值:队最左的数