496. Next Greater Element I*
https://leetcode.com/problems/next-greater-element-i/
题目描述
You are given two arrays (without duplicates) nums1
and nums2
where nums1
’s elements are subset of nums2
. Find all the next greater numbers for nums1
's elements in the corresponding places of nums2
.
The Next Greater Number of a number x
in nums1
is the first greater number to its right in nums2
. If it does not exist, output -1
for this number.
Example 1:
Input: nums1 = [4,1,2], nums2 = [1,3,4,2].
Output: [-1,3,-1]
Explanation:
For number 4 in the first array, you cannot find the next greater number for it in the second array, so output -1.
For number 1 in the first array, the next greater number for it in the second array is 3.
For number 2 in the first array, there is no next greater number for it in the second array, so output -1.
Example 2:
Input: nums1 = [2,4], nums2 = [1,2,3,4].
Output: [3,-1]
Explanation:
For number 2 in the first array, the next greater number for it in the second array is 3.
For number 4 in the first array, there is no next greater number for it in the second array, so output -1.
Note:
- All elements in
nums1
andnums2
are unique. - The length of both
nums1
andnums2
would not exceed 1000.
C++ 实现 1
找到 num1
中的每个数在 nums2
中的 next greater number. 先用哈希表存储 nums2
中每个数对应的索引, 然后查找 nums1
中每个数在 nums2
中的位置 idx
, 最后查找 Next Greater Number.
这道题还可以使用栈来做, 见 C++ 实现 2
, 使用栈更为通用, 比如可以解决 1019. Next Greater Node In Linked List** 这道题.
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> record;
for (int i = 0; i < nums2.size(); ++ i) record[nums2[i]] = i;
vector<int> res;
for (auto &n : nums1) {
auto idx = record[n];
auto greater = n;
for (int i = idx + 1; i < nums2.size(); ++ i) {
if (nums2[i] > greater) {
greater = nums2[i];
break;
}
}
if (greater != n) res.push_back(greater);
else res.push_back(-1);
}
return res;
}
};
C++ 实现 2
使用栈来实现. 哈希表 record
记录 nums2
中每个存在 NEG 的元素, 它们对应的 NEG 的位置. 如果在遍历 nums2
的过程中, 暂时没有遇到 NEG, 就应该将元素加入到栈中.
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> record;
vector<int> res(nums1.size(), -1);
stack<int> st;
// record 保存了 nums2 中每个存在 NGE 的元素对应的 NGE 的索引
for (int i = 0; i < nums2.size(); ++ i) {
while (!st.empty() && nums2[i] > nums2[st.top()]) {
record[nums2[st.top()]] = i;
st.pop();
}
st.push(i);
}
for (int i = 0; i < nums1.size(); ++ i)
if (record.count(nums1[i]))
res[i] = nums2[record[nums1[i]]]; // 注意 record 中保存的是索引
return res;
}
};