奔涌的LeetCoder(三):栈(2)
单调栈
栈是很简单的一种数据结构,先进后出的逻辑顺序,非常符合某些问题的求解特点。
单调栈实际上就是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)。实际上,单调栈的用途并不算广泛,只适合处理一种典型的问题,叫做 Next Greater Element
的问题。本文将讲解单调栈解决这类问题的实际问题。
首先,讲解 Next Greater Number
的原始问题:给你一个数组,返回一个等长的数组,对应索引存储着下一个更大元素,如果没有更大的元素,就存 -1。在此简单举个栗子:
给你一个数组 [2,1,2,4,3],你返回数组 [4,2,4,-1,-1]。
解释:第一个 2 后面比 2 大的数是 4; 1 后面比 1 大的数是 2;第二个 2 后面比 2 大的数是 4; 4 后面没有比 4 大的数,填 -1;3 后面没有比 3 大的数,填 -1。
上述这个例子的的暴力解法很好想到,就是对每个元素后面都进行扫描,找到第一个更大的元素就行了。但是暴力解法的时间复杂度是 O(N * N),空间复杂度为O(1)。因此,我们考虑,是否可以用空间来换取时间复杂度的降低?实际是有可行性的。
下面,来几盘正菜,边吃边自己体会吧,我就懒得讲了!
496. 下一个更大元素 I[简单]
说明:
给定两个 没有重复元素 的数组 nums1
和 nums2
,其中nums1
是 nums2
的子集。找到 nums1
中每个元素在 nums2
中的下一个比其大的值。
nums1
中数字 x 的下一个更大元素是指 x 在 nums2
中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
示例:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
解答:
解法:单调栈。
public class Solut