单调栈-下一个更大元素 I

该文章介绍了一个编程问题,涉及寻找数组中的下一个更大元素。使用单调栈从后往前遍历数组,找到每个元素右侧的第一个更大值。当栈顶元素小于当前元素时,弹出栈顶元素,直到找到匹配的更大元素或栈为空。若不存在更大元素,则标记为-1。最后,根据nums1中的元素获取其在nums2中的下一个更大元素。
摘要由CSDN通过智能技术生成

下一个更大元素 I

题目

下一个更大元素 I

内容

nums1 中数字 x下一个更大元素 是指 xnums2 中对应位置 右侧第一个x 大的元素。

给你两个 没有重复元素 的数组 nums1nums2 ,下标从 0 开始计数,其中nums1nums2 的子集。

对于每个 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值