栈
栈的基本操作
- 题目:栈的压入、弹出序列[剑指Offer]
题解:理解题目即可。
辅助栈:作用:1.翻转 2. 与栈配合,同序保存栈每一状态对应的东西。
-
题目:两个栈实现队列 [剑指Offer][思路]
题解:入队push:正常;出队pop:从辅助栈pop。(pop时若辅助栈为空,则把栈顶元素依次移到辅助栈) -
题目:包含min函数的栈 [剑指Offer][思路]
题解:辅助栈存最小元素,栈顶为当前最小元素。(注意辅助栈开始为空的情况)
单调栈:作用:维护以某个值为最小(最大)值的最大区间。
- 单调栈实现方法:求最小值(最大值)的最大区间,维护一个递增(递减)的栈,当遇到一个比栈顶小的值的时候开始弹栈,弹栈停止的位置到这个值的区间即为此值左边的最大区间;同时,当一个值被弹掉的时候也就意味着比它更小(更大)的值来了,也可以计算被弹掉的值得右边的最大区间。
- 题目:找到数组中每一个元素离它最近且比它小的元素位置,返回二元数组。[思路]
题解:维护单调栈,由底到顶严格递增。栈顶元素弹出时,栈里顶端元素和当前要入栈的元素即为符合条件的两元素。此外,当加入完成后弹出栈里元素,右侧均为-1。
队列
辅助队列
- 题目:两个队列实现栈 [剑指Offer]
题解:push:正常;pop;把队列前面的元素入到辅助队列,再把队尾元素pop
单调队列(双向链表LinkedList实现):作用:维护区间内的最大值/最小值。
-
单调队列是单调递增或者是单调递减的一种队列。例如一个递增队列,若将数列1 6 5 3 8放入队列中,则队列的每一步变化为:1、1 6、1 5、1 3、1 3 8 。每当放入的元素使得队列不在单调,则弹出队尾的元素,直到使得队列元素单调。
maxQue.pollLast()
maxQue.addLast()
maxQue.peekFirst();
具体题目中,队尾的出入队满足单调队列的操作,队首的出队则主要是判断队首是否还在当前有效窗口内。 -
题目:生成滑动窗口最大值数组。[思路]
题解:维护单调递减队列,队首维护当前窗口最大元素。新元素的入队满足单调递减队列的入队方式,小于队尾元素则直接入队,大于则弹出队尾元素。
为判断队列中的元素一直在滑动窗口内,队列存元素在数组中的位置而不是大小,当队首与队尾元素差值大于窗口大小,则队首出队。 -
题目:最大值减去最小值 小于或等于num 的子数组的数量[实现]
题解:分析题目,有结论:- 如果数组arr[i...j]满足条件,则它的每一个子数组都满足条件。
- 如果数组arr[i...j]不满足条件,则包含它的每一个数组都不满足条件。
数据结构:用i、j表示当前窗口,分别使用两个双端队列维护窗口的最大值和最小值。
具体地,每次更新两个双端队列,检查当前的窗口是否满足条件,满足则j++,不满足则cnt+=j-i,更新双端队列,i++,j不变。若j到了len,则当前趟和剩余未遍历的都满足条件,加到cnt中。
与生成滑动窗口最大值数组不同的,队首出队判断:当i要i++时,判断单调队列中队首是否等于arr[i],等于的话队首出队。
链表
二叉树
递归
- 题目:仅用递归函数实现栈的翻转 [实现]
- 题解:看代码。两个递归函数。第一个递归函数实现弹出栈底元素:弹出-递归-放入。第二个递归函数利用第一个递归函数实现栈的翻转:弹出栈底-递归-放入。
动态规划
字符串
大数据和空间限制
位运算
数组和矩阵
- 题目:对给定数组,求最长连续递增子序列的长度
题解:简单,遍历一遍维护最大长度即可。