单调栈
栈内的数据是有序的,分为单调递增栈和单调递减栈
- 单调递增栈:从栈顶到栈底递增,后加入的元素小于先加入的元素
- 单调递减栈:从栈顶到栈底递减,后加入的元素大于先加入的元素
相关题目
496. 下一个更大元素 I
思路
单调栈加哈希表
用哈希表记录在nums1的每个数字出现的索引。在nums2中用单调栈。在hashmap中查找nums2中的数是否出现在nums1中,如果出现过,给出在nums2中找到的对应比它大的数。注意在栈中存储的是索引
倒着来,两个较高的数之间较矮的就直接跳过(入栈后被弹出)
代码
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> stk;
vector<int> res(nums1.size());
unordered_map<int, int> map;
for(int i = 0; i < nums1.size(); i++){
map[nums1[i]] = i;
}
for(int i = nums2.size() - 1; i >= 0; i--){
while(!stk.empty() && nums2[stk.top()] < nums2[i]){
stk.pop();
}
if(map.find(nums2[i]) != map.end()){
int temp = stk.empty() ? -1: nums2[stk.top()];
res[map[nums2[i]]] = temp;//nums2[i]中的数也是nums[1]中的数,用map得到在nums1中的索引,也就是res在这个数对应位置,赋上在nums2中找到的值
}
stk.push(i);
}
return res;
}
};
时间复杂度: O(n)
503. 下一个更大元素 II
思路
环形的,在后面再拼接一个相同的数组
对长度取余,来获得环形特效
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
vector<int> res(n, -1);
stack<int> S;
for(int i = 0; i < 2 * n - 1; i++){
while(!S.empty() && nums[S.top()] < nums[i % n]){
res[S.top()] = nums[i % n];//不是按顺序放
S.pop();
}
S.push(i % n);//S里放入的索引
}
return res;
}
};
参考
https://leetcode-cn.com/problems/next-greater-element-i/solution/dan-diao-zhan-jie-jue-next-greater-number-yi-lei-w/