1、题目
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
链接:https://leetcode-cn.com/problems/next-greater-element-i
2、思路分析
1)暴力求解
不推荐,这里题目的进阶时间复杂度要求O(m+n)。
2)栈
这里的做法是:利用哈希表保存该值的下一个更大的元素的值,再利用nums1的顺序,将其拼接到vector中。
利用单调栈的性质,将有大于该值的元素就保存在哈希表中。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> s;
vector<int> res;
unordered_map<int, int> temp;
for(int i = 0; i < nums2.size(); ++i){
while(!s.empty() && nums2[i] > s.top()){
temp[s.top()] = nums2[i]; // temp左边存值,右边存大于该值的元素
s.pop();
}
s.push(nums2[i]);
}
while(!s.empty()){
temp[s.top()] = -1;
s.pop();
} // 处理栈未空情况
// 以nums1中的顺序将哈希表中的元素写入到res中
for(int i = 0; i < nums1.size(); ++i){
res.push_back(temp[nums1[i]]);
}
return res;
}
};
代码优化:栈中没处理的元素不用单独处理了,直接在循环中判断,如果此时栈空的话,表示没有大于当前值的元素,将该位置置为-1。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> s;
vector<int> res;
unordered_map<int, int> temp;
for (int i = nums2.size() - 1; i >= 0; --i){
while (!s.empty() && nums2[i] > s.top()){
s.pop();
}
temp[nums2[i]] = (s.empty() == true ? -1 : s.top());
s.push(nums2[i]);
}
for (int i = 0; i < nums1.size(); ++i){
res.push_back(temp[nums1[i]]);
}
return res;
}
};