ou 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.
题目大意:给两个数组findNums和nums,返回一个和findNums等长的数组,其返回的内容为:对于findNums[i],返回的result[i]为nums[i]数组中,findNums[i]的后面的元素中第一个比findNums[i]大的元素。如果不存在这样的元素就写-1。其中findNums数组是nums数组的子数组
MySolution:
大致思路:从后面往前面遍历nums,建立关系map<nums元素,往右第一个比nums大的元素>relation,之后findnums直接访问这个map即可。
考虑nums[i] + nums[i+1],relation[nums[i+1]] 为val
1.if(nums[i] < nums[i+1]) 则relation[nums[i]]应该为nums[i+1]
2.if(nums[i] > nums[i+1] &&-1==val) 没有比nums[i+1]更大的数,自然没有比nums[i]更大的数,所以为-1
3.if(nums[i] > nums[i+1] &&-1!=val&&val<nums[i]) val比nums[i+1]大,但不一定比nums[i]大,所以用val取代nums[i+1]一直找,直到找到符合1或2
4.if(nums[i] > nums[i+1] &&-1!=val&&val>nums[i]) 显然 relation[nums[i]]应该为val
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int> temp;
map<int,int> relation;
int m = findNums.size();
int n = nums.size();
if(n==0)
return temp;
relation[nums[n-1]] = -1;
for (int i = n - 2; i >= 0; --i)
{
if (nums[i] < nums[i+1])
relation[nums[i]] = nums[i+1];
else
{
int val = relation[nums[i+1]];
if (-1 == val)
relation[nums[i]] = -1;
else
{
while (-1 != val)
{
if (val > nums[i])
break;
val = relation[val];
}
relation[nums[i]] = val;
}
}
}
for (int i = 0; i < m ; ++i)
{
temp.push_back(relation[findNums[i]]);
}
return temp;
}
};
网上看到的其他做法,比较简洁:(csdn liuchuo)
分析:(设栈顶的元素A,那么栈里面比A小的都没有搜索价值了,直接出栈)使用栈,从后往前遍历nums[i],每当栈不为空的时候,一直出栈直到遇到比nums[i]大的数字停止。设立一个map<int, int> m,存储nums中每一个元素以及它对应的下一个最大元素构成的映射。如果停止后栈为空就将m[nums[i]]标记为-1,否则就写栈的栈顶元素~
最后将findNums中出现的每一个元素对应的map的值放入result数组中返回~
最后将findNums中出现的每一个元素对应的map的值放入result数组中返回~
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int> result;
stack<int> s;
map<int, int> m;
for (int i = nums.size() - 1; i >= 0; i--) {
while (!s.empty() && s.top() <= nums[i])
s.pop();
m[nums[i]] = s.empty() ? -1 : s.top();
s.push(nums[i]);
}
for (int i = 0; i < findNums.size(); i++)
result.push_back(m[findNums[i]]);
return result;
}
};