496. 下一个更大元素 I
思路:单调栈+哈希表
可以预处理nums2, 使用单调栈计算nums2每个元素右边的第一个更大的值,使用哈希表存储结果。
单调栈维护当前位置右边更大的元素列表,从栈底到栈顶元素单调递减。
具体地,每次移动到数组中一个新的位置i,就将当前单调栈所有小于nums2[i]的元素弹出单调栈,当前位置右边的第一个更大的元素即为栈顶元素,如果栈为空则说明当前位置右边没有更大的元素。随后将位置i的元素入栈。
因为nums2没有重复元素,可以使用哈希表存储元素值和其右边第一个更大的元素值的对应关系。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> stk;
unordered_map<int,int> mp;
for(int i=nums2.size()-1;i>=0;--i){
while(stk.size()&&stk.top()<nums2[i]) stk.pop();
mp[nums2[i]]=stk.empty()?-1:stk.top();
stk.push(nums2[i]);
}
vector<int> ans(nums1.size());
for(int i=0;i<nums1.size();++i){
ans[i]=mp[nums1[i]];
}
return ans;
}
};
时间复杂度 O(m+n) m是nums1的长度,n是nums2的长度
空间复杂度 O(n)