1、描述
496给定两个 没有重复元素 的数组 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。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
两个数组、
3、思路
两层循环暴力求解,在外一层的for语句中定位每一个元素,然后通过下标变量i来定位第二个数组中相同元素的位置,然后再往后边去一个,比较一下
单调栈,维护一个从上到下单调不减栈
4、notes
二层循环的话就第一层用for语句,内层用for循环可能会清晰一些
5、复杂度
时间:O(N2)平方
空间:O(N)结果集
6、code
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int>res;
for(auto n:nums1) // 第一层遍历就用for语句
{
int i=0;
while(nums2[i]!=n) i++;//使用while来寻找在第二个数组中的相等的值的位置正好用i来标记了
i++; // 第二个数组的后一个位置
for(;i<nums2.size();i++) // 第一个分句可以省了
{
if(n<nums2[i]) //如果小于就直接把结果填进去
{
res.push_back(nums2[i]);
break;
}
}
if(i==nums2.size()) // 最后找到最后没找到就进去-1
res.push_back(-1);
}
return res;
}
};
6、2单调栈+hash映射
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int>res; // 定义结果集
unordered_map<int,int>mp; //hash映射
stack<int>st; //单调栈
for(int n:nums2) // 遍历整个nums2通过单调栈,构造hash映射
{
while(!st.empty()&& st.top()<n) // 栈非空时候,且新元素比栈顶元素更大,
{
mp[st.top()]=n; // 把栈顶元素构成一个 键值对 存起来
st.pop(); // 当前已经找到了栈顶元素的最近大值,就出栈
}
st.push(n); // 把当前元素压栈
}
while(!st.empty()) // 把剩下的没有更高的值赋值 -1
{
mp[st.top()]=-1;
st.pop();
}
for(auto tem:nums1) // 遍历输出结果
{
res.push_back(mp[tem]);
}
return res;
}
};