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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~