题目
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?
思路
这道题暴力可以求解,但是对进阶的低时间复杂度要求,做出以下思路:
注:一但求数组中下一个最大元素,首先想到单调栈
- 定义一个空栈
- 对全集合nums2从后依次往前遍历
- 若目前栈内元素比遍历元素小,依次将栈内元素出栈,直到栈顶元素比当前元素大或栈内无元素停止
- 如果栈内还有元素,则栈顶元素为当前元素的下一个更大元素。如果栈内无元素,说明没有比当前元素更大的元素了。
- 将当前元素入栈(为前面元素做大小判断使用)
代码
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> nums;
unordered_map<int, int> mp;
stack<int> s;
for(int i=nums2.size()-1;i>=0;i--){
int num=nums2[i];
while(!s.empty()&&num>s.top()) s.pop();
if(s.empty()) mp[num]=-1;
else mp[num]=s.top();
s.push(num);
}
for(int i=0;i<nums1.size();i++){
nums.push_back(mp[nums1[i]]);
}
return nums;
// vector<int> num;
// int f;
// for(int i=0;i<nums1.size();i++){
// f=0;
// for(int j=0;j<nums2.size();j++){
// if(nums1[i]==nums2[j]) {
// for(int r=j+1;r<nums2.size();r++){
// if(nums1[i]<nums2[r]){
// f=1;
// num.push_back(nums2[r]);
// break;
// }
// }
// }
// if(f) break;
// }
// if(f==0) num.push_back(-1);
// }
// return num
}
};