uacs2024

导航

leetcode496-下一个更大元素I——单调栈解决下一个更大元素问题

 

https://leetcode.cn/problems/next-greater-element-i/

方法一:暴力

vector<int> res;int size1=nums1.size(),size2=nums2.size();
        for(int i=0;i<size1;i++)
        {
            int tempj;bool flag=false;
            for(int j=0;j<size2;j++)
            {
                if(nums1[i]==nums2[j]&&!flag)
                {
                    tempj=j;flag=true;continue;
                }
                if(flag&&nums2[j]>nums2[tempj])
                {
                    res.push_back(nums2[j]);break;
                }
            }
            if(i==res.size())   res.push_back(-1);
        }
        return res;
方法二:单调栈
暴力解法的时间复杂度为o(n^2),对于nums1中的每一个数都要重复地遍历nums2数组,造成了很多不必要的时间开销。
使用一个哈希表记录nums2中每一个元素的下一个更大值,然后只需要遍历一次nums1数组就立刻知道对应nums2数组中的下一个更大值
https://leetcode.cn/problems/next-greater-element-i/solution/dan-diao-zhan-jie-jue-next-greater-number-yi-lei-w/
把数组中的元素当成是身高不同的人,某数的下一个更大值就是第一个遮挡右边视线的数

 

 

 

 

       int size1=nums1.size(),size2=nums2.size();
        stack<int> bigger;
        unordered_map<int,int> number_map;
        vector<int> res;//返回结果
        for(int i=size2-1;i>=0;i--)
        {
            while(!bigger.empty()&&bigger.top()<=nums2[i])
            {
                bigger.pop();
            }
            number_map.emplace(nums2[i],bigger.empty()?-1:bigger.top());
            bigger.push(nums2[i]);
        }
        for(int i=0;i<size1;i++)
        {
            res.push_back(number_map[nums1[i]]);
        }
        return res;

 

posted on 2022-09-04 12:17  ᶜʸᵃⁿ  阅读(19)  评论(0编辑  收藏  举报