单调栈问题
首先什么是单调栈?并不是栈中的元素是单调的**而是指出栈的序列是单调的,所以分为单增栈和单减栈。
单增栈的实现思路:当栈为空,或者加入的元素大于栈顶元素时,将栈中比当前小的数据一次弹出,当加入数据小于栈定元素时,则直接进栈。
单减栈相反在此就不再叙述,接下来是单调栈的模板:
1 | stack<int> st; |
我们可以发现单调栈在解决
比当前元素更大的下一个元素
比当前元素更大的前一个元素
比当前元素更小的下一个元素
比当前元素更小的前一个元素
时有显著的优势,接下来我们来举几个例题:详解
leetCodeT739每日温度:
思路分析:其实我们分析可得,就是要找到比当前气温高的日期(下标),如果我们暴力求解时间复杂度会比较高,我们采用单调栈的方法,注意我们是将气温对应的下标压入栈中,而不是气温,具体代码如下:
1 | public static int[] dailysTemperature(int [] T) { |
leetCodeT496下一个更大元素:
给定两个没有重复元素的数组nums1 和nums2,其中nums1是nums2的子集。找nums1中每个元素在nums2中的下一个比其大的值。
nums1中数字x的下一个更大元素是指x在nums2中对应位置的右边的第一个比x大的元素。如果不存在,对应位置输出 -1 。
示例:
1 | 输入: nums1 = [4,1,2], nums2 = [1,3,4,2]. |
思路分析:其实我们不难发现,这也是一个寻找下一个更大数的题目,所以我们仍然使用单调栈,此题我们可以将nums2看作单调栈,用哈希表存储nums1,当我们找到nums【i】的下一个更大数时,我们看看nums1中有没有对应的数,有的话就找到对应的答案,这样复杂夫o(n)遍历nums2数组:
注意此题,我们要存储的是值,而不是值对应的下标
1 | class Solution { |