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;