2021_04_26 单调栈相关题目

单调栈

栈内的数据是有序的,分为单调递增栈和单调递减栈

  • 单调递增栈:从栈顶到栈底递增,后加入的元素小于先加入的元素
  • 单调递减栈:从栈顶到栈底递减,后加入的元素大于先加入的元素

相关题目

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值