一、OverView
在前面已经提及过 栈 这个数据结构,在 LeetCode 中有考察过这样一种栈操作:单调栈。
顾名思义,这是在栈的基础上达到单调递增或单调递减的效果。
大概的过程如下:
如果想达到递增的效果:
- 进栈:首先要比较与栈顶的大小,如果比栈顶元素大,那么直接放在栈顶即可;否则要将栈顶元素出栈,然后将这个元素与栈顶元素进行比较
- 出栈:直接出栈即可
如果想达到递减的效果:
- 进栈:首先要比较与栈顶的大小,如果比栈顶元素小,那么直接放在栈顶即可;否则要将栈顶元素出栈,然后将这个元素与栈顶元素进行比较
- 出栈:直接出栈即可
二、Example
假如有下面的例子:
有一组数为:
1,4,2,5,7,6,8
现在要得到一个单调递增栈,过程如下:
| Step | Op | Stack |
|---|---|---|
| 1 | 1 push | 1 |
| 2 | 4 push | 1 4 |
| 3 | 4 pop | 2 push | 1 2 |
| 4 | 5 push | 1 2 5 |
| 5 | 7 push | 1 2 5 7 |
| 6 | 7 pop | 6 push | 1 2 5 6 |
| 7 | 8 push | 1 2 5 6 8 |
三、LeetCode 496
看一个典型例子 LeetCode 0496 :
题意:给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
1 | Input: nums1 = [4,1,2], nums2 = [1,3,4,2]. |
分析:
1 | public int[] nextGreaterElement(int[] nums1, int[] nums2) { |