LeetCode
下一个更大元素 I
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
示例 2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于num1中的数字2,第二个数组中的下一个较大数字是3。
对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。
注意:
nums1和nums2中所有元素是唯一的。
nums1和nums2 的数组大小都不超过1000。
for(n:nums1)——指的是遍历nums中的值。
1. 暴力解法:
最简单的办法就是对于nums1中的每一个元素,首先找到其在nums2中所在的位置。然后在nums2中从该位置+1开始往后依次判断,看是否有比该数大的元素,如果有就将这个数放入定义的vector中,没有就在vector中加入-1。
class Solution(){
public:
vector<int> nextGreatElement(vector<int>& nums1, vector<int>& nums2){
vector<int> res;
for(int n:nums1){
int i = 0;
while(nums2[i] != n){
i++;
}
i++;
for(;i<nums2.size();i++){
if(nums2[i] > n){
res.push_back(nums2[i]);
break;
}
}
if(i == nums2.size()){
res.push_back(-1);
}
}
return res;
}
};
2. 单调栈:
这道题出现在使用栈来解决的题目范围,所以得使用到栈。
对于nums2中的元素,构造一个单调不增的栈。
依次扫描nums2中的元素,如果扫描到第i位后,发现当前的栈顶元素小于第i位的值,那么就意味着栈顶元素找到了下一个比其大的值。接下来要做的就是将其记录到一个哈希表中,值就是对应的元素值,索引是栈顶元素的值。如果不如栈顶元素大,那么直接入栈。扫描完nums2,那么留在栈中的元素都是在其右边没有比它的的数据存在的元素。这样的数据,在哈希表中的值均设置为-1,索引是栈顶元素的值。最后,对于nums1来讲,利用其所有元素作为索引,可以在哈希表中依次找到对应的下一个更大元素。
class Solution(){
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2){
vector<int> res;
unordered_map<int, int> map;
stack<int> s1;
for(int n:nums2){
while(!s1.empty() && s1.top() < n){
mp[s1.top] = n;
s1.pop();
}
s1.push(n);
}
while(!s1.empty()){
mp[s1.top()] = -1;
s1.pop();
}
for(int n:nums1){
res.push_back(mp[n]);
}
return res;
}
};