题目:
nums1
中数字 x
的 下一个更大元素 是指 x
在 nums2
中对应位置 右侧 的 第一个 比 x
大的元素。
给你两个 没有重复元素 的数组 nums1
和 nums2
,下标从 0 开始计数,其中nums1
是 nums2
的子集。
对于每个 0 <= i < nums1.length
,找出满足 nums1[i] == nums2[j]
的下标 j
,并且在 nums2
确定 nums2[j]
的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1
。
返回一个长度为 nums1.length
的数组 ans
作为答案,满足 ans[i]
是如上所述的 下一个更大元素 。
示例:
- 输入: n u m s 1 = [ 4 , 1 , 2 ] , n u m s 2 = [ 1 , 3 , 4 , 2 ] . nums1 = [4,1,2], nums2 = [1,3,4,2]. nums1=[4,1,2],nums2=[1,3,4,2].
- 输出: [ − 1 , 3 , − 1 ] [-1,3,-1] [−1,3,−1]
- 解释: nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
解题思路:单调栈
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> res(nums1.size(), -1);
stack<int> stk;
unordered_map<int, int> hash;
for(int i = 0; i < nums1.size(); i++) hash[nums1[i]] = i;
stk.push(0);
for(int i = 1; i < nums2.size(); i++){
while(!stk.empty() && nums2[i] > nums2[stk.top()]){
if(hash.count(nums2[stk.top()]) > 0){
int idx = hash[nums2[stk.top()]];
res[idx] = nums2[i];
}
stk.pop();
}
stk.push(i);
}
return res;
}
};