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.思路:题目要求看清楚,第一个数列中的某一个数,放回到第二个数列,该数从第二个数列中的位置开始,往后找,找是否有比该数大的数。
代码1:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int> result;
int pos;
for(int j=0; j<findNums.size();j++){
bool flag=true;
auto p=find(nums.begin(),nums.end(),findNums[j]);
pos=distance(nums.begin(),p);
for(int i=pos+1;i<nums.size();i++){
if (nums[pos]<nums[i]){
result.push_back(nums[i]);
flag =false;
break;
}
}
if (flag){
result.push_back(-1);
}
}
return result;
}
};
代码2:
class Solution {
public:
int findno(vector<int>& nums, int aim){
int i = find(nums.begin(),nums.end(),aim)-nums.begin();
for(;i<nums.size();i++){
if(nums[i]>aim){return nums[i];}
}
return -1;
}
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int> res;
for(int i=0;i<findNums.size();i++){
res.push_back(findno(nums, findNums[i]));
}
return res;
}
};
代码3:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int> res;
unordered_map<int,int> mp;
for(int i=0; i<nums.size(); i++) mp[nums[i]]=i;
for(int i=0; i<findNums.size(); i++){
int newval=-1;
for(int j=mp[findNums[i]]+1; j<nums.size(); j++){
if(findNums[i]<nums[j]) { newval=nums[j]; break; }
}
res.push_back(newval);
}
return res;
}
};
该方法巧在利用map存储一个数nums[i]的位置i,然后利用map查找位置比从头开始要快?