解答
单调栈+哈希,这里记录一下两种顺序相反的实现方式:顺序遍历和逆序遍历数组都可以,但是逻辑变化
代码一
- 记录nums1中(val, idx)的映射
- 从左到右遍历nums2,
now=nums2[i]
在now > st.top()
部分中,now
是出栈元素的nextGreater, 从当前值now 确定以当前值now为nextGreater的元素 (根据nextGreater确定元素), 出栈元素找到了nextGreater,查表
这里的单调栈是单调递增栈(从栈顶到栈底)
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int,int> mp;// (val, idx)
for(int i=0; i<nums1.size(); i++){
mp.insert(make_pair(nums1[i], i));
}
vector<int> ans(nums1.size(), -1);
stack<int> st;
int now=0;
for(int i=0; i<nums2.size(); i++){
now = nums2[i];
if(st.empty()) st.push(now);
else if(now <= st.top()) st.push(now);
else{//nums2[i] > st.top()
while(st.empty()==false && nums2[i] > st.top()){
if(mp.find(st.top()) != mp.end())
ans[ mp[st.top()] ] = now;
st.pop();
}
st.push(now);
}
}
return ans;
}
};
代码二
- 从右到左遍历nums2,
now=nums2[i]
每次st.top()是当前元素的nextGreater (需要满足now > st.top()
,否则循环出栈), 与代码一不同,这里是 根据当前值now确定now的nextGreater (根据元素找nextGreater), 可以看到正好与代码一相反。map记录的是nums2中(val, nextGreater)的映射
这里的单调栈也是单调递增栈(从栈顶到栈底) - 查表
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int,int> mp;
stack<int> st;
int now=0;
for (int i = nums2.size() - 1; i >= 0; --i) {
now = nums2[i];
if(st.empty()) mp[now] = -1; // 右边没有比now大的值
else if(now < st.top()) mp[now] = st.top(); // st.top()是now的nextGreater
else{ // now > st.top()
while(!st.empty() && now>=st.top())
st.pop();
mp[now] = st.empty() ? -1 : st.top();
}
st.push(now);
}
vector<int> ans(nums1.size());
for (int i = 0; i < nums1.size(); ++i) {
ans[i] = mp[nums1[i]];
}
return ans;
}
};