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.
题目大意:给出两个数组nums1和nums2,对nums1中的每个元素,要求查找其在nums2中对应位置右边第一个大于它的值。如不存在,记为-1.
方法一:数据范围并不大,暴力求解
class Solution{
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums){
vector<int>vec;
int k;
for(int i=0; i<findNums.size(); i++){
vec.push_back(-1);
for(int j=0; j<nums.size(); j++)
if(nums[j]==findNums[i]){
k=j;
break;
}
for(int j=k+1; j<nums.size(); j++){
if(nums[j]>findNums[i]){
vec[i]=nums[j];
break;
}
}
}
return vec;
}
};
方法二:为nums2数组中的每个元素,建立一个元素值与位置的映射,其中元素值为键,位置为值。这样我们便可较容易的获得nums1中元素在nums2中对应的位置。
class Solution{
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int>vec;
map<int,int>mp;
int k;
for(int i=0; i<nums.size(); i++) {
mp[nums[i]]=i;
}
for(int i=0; i<findNums.size(); i++) {
vec.push_back(-1);
k=mp[findNums[i]];
for(int j=k+1; j<nums.size(); j++) {
if(nums[j]>findNums[i]) {
vec[i]=nums[j];
break;
}
}
}
return vec;
}
};
方法三:为nums2数组维护一个栈,栈中的元素都未找到下一个大于它的值。当栈为空或者栈顶元素大于遍历到的nums2[i]时,nums2[i]入栈,表示nums2[i]还未找到下一个大于它的值。当栈顶元素小于nums2[i]时,则有栈顶元素找到下一个较大的元素,将其出栈并记录。利用unordered_map<int,int>来保存nums2中元素与其下一个大值的映射。最后遍历nums1数组,得到结果。
class Solution{
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums){
vector<int>vec;
stack<int>st;
unordered_map<int,int>mp;
for(int i=0; i<nums.size(); i++){
while(!st.empty()&&st.top()<nums[i]) {
//栈顶元素得到其下一个大值
mp[st.top()]=nums[i]; //保存映射
st.pop();
}
st.push(nums[i]); //元素入栈
}
for(int i=0; i<findNums.size(); i++){
vec.push_back(mp.count(findNums[i])?mp[findNums[i]]:-1);
//mp.count(findNums[i])为0,表示mp中不存在键为findNums[i]的映射,即无下个大值。
}
return vec;
}
};