题目:
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.
思路:
我们定义一个哈希表,用来记录num右边的第一个greater number。怎么建立哈希表呢?答案是对nums进行扫描,如果栈为空或者当前num比栈顶元素小,就入栈;否则就说明栈顶元素右边第一个greater number就是当前元素,所以我们就将其插入哈希表中,同时栈顶元素出栈。循环这个过程直到栈为空或者当前num比栈顶元素小。最后别忘了将当前元素入栈。
最后再扫描一遍,对于findNums中的每个元素,在哈希表中查找它右侧的第一个greater number,并且加入结果集中。算法的时间复杂度是O(n),空间复杂度是O(n)。
代码:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
unordered_map<int, int> hash;
vector<int> ret;
stack<int> st;
for (int i = 0; i < nums.size(); ++i) {
if (st.empty() || st.top() > nums[i]) {
st.push(nums[i]);
}
else {
while (!st.empty() && st.top() < nums[i]) {
hash.insert(make_pair(st.top(), nums[i]));
st.pop();
}
st.push(nums[i]);
}
}
for (int i = 0; i < findNums.size(); ++i) {
if (hash.count(findNums[i]) == 0) {
ret.push_back(-1);
}
else {
ret.push_back(hash[findNums[i]]);
}
}
return ret;
}
};