题目
内容
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]
是如上所述的 下一个更大元素 。
思路
单调栈,从后往前挨个找即可。
代码
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
int maxn = (int)1e5;
int pos2[] = new int[maxn];
Stack<Integer> myStack = new Stack<>();
for(int i=len2-1;i>=0;i--){
while(!myStack.empty() && myStack.peek()<nums2[i]){
myStack.pop();
}
pos2[nums2[i]] = myStack.empty()?-1:myStack.peek();
myStack.push(nums2[i]);
}
int ans[] = new int[len1];
for(int i=0;i<len1;i++){
ans[i] = pos2[nums1[i]];
}
return ans;
}