uacs2024

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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   ᶜʸᵃⁿ  阅读(28)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示