单调栈和单调队列有点像,其实本质就是以一个栈或队列去存放一堆单调递增或单调递减的数据,队列一般用于对元素个数有要求的情况,而单调栈一般用于对元素个数无限制,或者说对元素个数是inf的情况。
直接上代码:
vector<int> nextGreaterElement(vector<int>& nums1) {
//单调栈
vector<int>mir(nums2.size());
stack<int>stk;
for(int i=nums2.size()-1;i>=0;i--){
while(!stk.empty()&&nums2[i]>=stk.top()){
//注意是大于等于
//小了就走,大的留下
stk.pop();
}
mir[i]=stk.empty()?-1:stk.top();
//存大
stk.push(nums2[i]);
//每一个都要入栈哦!
}
return mir;
以上是leetcode第496题的一段,最后可以用哈希表输出,时间复杂度更低,其代码原理如下所示:
与此题类似的还有leetcode739题,stk存放元素下标,返回的是下标之差;leetcode503中则采用环形数组,用i=2*n-1然后加以取模即可。
用到单调栈的题还有leetcode316和leetcode1081,代码就不放了。