题面:
Add to List
496. Next Greater Element I
DescriptionHintsSubmissionsDiscussSolution
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.
题意:
给定两个数组,问数组1中的每个元素在数组2对应位置右侧的一个比其大的数的值,无则显示-1。
解题:
数据量仅1000,O(n*n)暴力可解,看了discuss标题,发现有O(n)解法,略瞟一眼,看到stack这个关键词,于是退出,自己思索。很快发现,只要从左往右扫数组2,用栈保存当前还未找到右侧第一个比它大的元素,每次扫到一个新元素,则与栈顶元素比较,若大于栈顶元素,则弹出栈顶元素,并将其对应值标为数组2中当前位置值,不断比较,直至栈中元素大于当前元素或栈为空,随后将当前元素加入栈。至于为什么这么可行,其实就是模拟了大脑线性扫描的过程,看似平常,但栈的运用真的很出彩。当然,结合map实现并不能称为O(n),但若用hash映射,就是真的O(n)了。
代码:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
stack <int> s;
map <int,int> m;
vector <int> v;
for(int i=0;i<nums.size();i++){
if(s.empty())
s.push(nums[i]);
else{
while(!s.empty()){
if(s.top()<nums[i]){
m[s.top()]=nums[i];
s.pop();
}
else break;
}
s.push(nums[i]);
}
}
for(int i=0;i<findNums.size();i++){
if(m.count(findNums[i])==0)
v.push_back(-1);
else
v.push_back(m[findNums[i]]);
}
return v;
}
};