LeetCode OJ 496. Next Greater Element I
Description
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 and nums2 are unique.
- The length of both nums1 and nums2 would not exceed 1000.
方法一
搜索:对于nums1中的每一个数,用C++内置find函数找到它在nums2中的位置,并往后找第一个大于它的数,如果找到就存到结果数组中,否则存-1。
代码
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int> ans;
if(findNums.size() == 0 || nums.size() == 0)
return ans;
for(int i = 0 ; i < findNums.size(); i++){
auto itr = find(nums.begin(), nums.end(), findNums[i]);
if(itr == nums.end())
ans.push_back(-1);
else{
for(itr;itr != nums.end(); itr++){
if(*itr > findNums[i]){
ans.push_back(*itr);
break;
}
}
if(itr == nums.end())
ans.push_back(-1);
}
}
return ans;
}
};
方法二
使用stack和unordered_map<key, value>
:对于nums2中的每一个数,存到stack中。如果某个数大于stack的栈顶元素,则这个数是nums2中大于栈顶的第一个数,保存这一对数到unordered_map中,然后栈顶元素出栈。循环做这样的操作,直到栈顶元素不大于这个数。遍历完nums2中的所有数。
对于nums1中的每一个数,在刚才保存的unordered_map<key, value>
中搜索,如果有这样的key值,则将对应的value保存到结果数组中。
代码
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int> ans;
stack<int> s;
unordered_map<int,int> m;
for(int num: nums){
while(!s.empty() && s.top() < num){
m[s.top()] = num;
s.pop(); //这一步很关键
}
s.push(num);
}
for(int num: findNums){
if(m.count(num)) ans.push_back(m[num]);
else ans.push_back(-1);
}
return ans;
}
};