当前位置:   article > 正文

496. 下一个更大元素I (单调栈)_int[] result = new int[nums1.length]; map

int[] result = new int[nums1.length]; map map = helper(num

496. 下一个更大元素 I

题目描述:

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

示例:

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]

解释:

对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。
对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。
对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1 。

思路分析:

由于数组nums1是nums2的子集,整体思路是先求解出数组nums2中每个元素对应的下一个更大元素。

然后存入map中,其中key是nums2中的元素值,value是下一个更大的元素。

最后,遍历数组nums1,拿当前考察的元素作为key在map中获取value即可。

至此,关键问题是如何求解出数组nums2中每个元素对应的下一个更大元素。

代码解析:

  1. class Solution {
  2. public int[] nextGreaterElement(int[] nums1, int[] nums2) {
  3. int[] result = new int[nums1.length];
  4. Map<Integer, Integer> map = helper(nums2);
  5. for(int i = 0; i < nums1.length; i++){
  6. result[i] = map.get(nums1[i]);
  7. }
  8. return result;
  9. }
  10. private Map<Integer, Integer> helper(int[] nums){
  11. Map<Integer, Integer> map = new HashMap<>();
  12. Stack<Integer> stack = new Stack<>();
  13. for(int i =0;i < nums.length;i++){
  14. //栈不空且当前元素大于栈顶元素
  15. //说明当前元素是栈顶元素的下一个更大元素
  16. //while循环表示当前元素是栈中所有已存在元素的下一个更大元素
  17. while(!stack.isEmpty() && nums[i] > stack.peek()){
  18. map.put(stack.pop(), nums[i]);
  19. }
  20. stack.push(nums[i]);
  21. }
  22. while(!stack.isEmpty()){
  23. map.put(stack.pop(), -1);
  24. }
  25. return map;
  26. }
  27. }

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号