递归调用实际上就是栈的进栈出栈操作、
单调栈
- 用处:单调栈可以用来寻找数组中每一个数大于(或者小于)它的第一个数、可见山峰对、最大子矩阵大小
- 复杂度:O(n)
- 原理:仅当若栈为空或当前遍历元素大于(或小于)栈顶元素时候进栈,否则弹出一直弹出栈顶元素,直到符合条件为止,而对于每个弹出的元素,遍历到的元素和它栈下的元素分别构成数组内大于或小于它的第一个数,遍历结束后,栈中剩余的元素,他们的右边没有大于或小于他们的一个元素,因此没有办法让他们弹出(栈内总是严格单调)
- tips:出栈后比较需考虑栈空情况
双端队列
- 用处:求滑动窗口最大值最小值、最大值减去最小值小于num的子数组数量
- 复杂度:O(n)
- 原理:创建一个队列用来储存极值,qmax or qmin,双指针法更新数组窗口,每次更新时候,进行两个操作,首先把当前遍历元素和双端队列的队尾进行比较,若满足条件则直接压入,否则弹出到满足条件为止,第二个操作是确认当前队首的下标是否过期,如果过期,则弹出。这两个操作保证队列的队首一定为极值。
栈的反转
- 首先构造Getandromovelast方法,该方法递归调用自身,先弹出栈顶元素,当弹出后,栈空时,返回最后一个元素,否则进行递归调用,并在递归后把弹出元素重新push进栈。
- 反转方法,也是递归调用自身,每次先调用一次Getandromovelast方法,然后若栈空(既递归走到临界点),则直接return,否则就调用自身,在递归结束后,把Getandromovelast的返回值重新push进栈