题目
思路一 模拟 遍历
遍历两个链表,找到符合条件的数。
代码一
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> ret;
int n=nums2.size();
for(int num:nums1){
int i=0;
while(num!=nums2[i]) i++;
while(i<n&&num>=nums2[i]) i++;
if(i==n) ret.push_back(-1);
else ret.push_back(nums2[i]);
}
return ret;
}
};
思路二 单调栈
从后往前遍历nums2,维护单调栈,从栈底到栈顶是递减的。如果当前元素比栈顶元素大,就不断pop出元素,直到可以将当前元素pop进去,那么此时的栈顶元素就是要返回的元素。如果pop完之后栈空了,那么说明不存在比当前元素大的元素。
代码二
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> s;
unordered_map<int,int> hash;
vector<int> ret;
for(int i=nums2.size()-1;i>=0;i--){
while(!s.empty()&&s.top()<nums2[i])
s.pop();
hash[nums2[i]]=s.empty()?-1:s.top();
s.push(nums2[i]);
}
for(int num:nums1){
ret.push_back(hash[num]);
}
return ret;
}
};
另一个单调栈思路
先把nums1的值和下标存到哈希表,使得能从值找到对应的下标。再从前往后遍历nums2,维护一个递减栈。如果当前元素大于栈顶元素,那么栈顶元素的下一个更大元素就是当前元素。
代码
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size(),n=nums2.size();
unordered_map<int,int> index(m);
for(int i=0;i<m;i++)
index[nums1[i]]=i;
stack<int> s;
vector<int> ans(m,-1);
for(int num:nums2){
while(!s.empty() && s.top()<num){
int cur=s.top();
if(index.count(cur))
ans[index[cur]]=num;
s.pop();
}
s.push(num);
}
return ans;
}
};