赞
踩
题目描述:
给你两个 没有重复元素 的数组 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中每个元素对应的下一个更大元素。
代码解析:
- class Solution {
- public int[] nextGreaterElement(int[] nums1, int[] nums2) {
- int[] result = new int[nums1.length];
- Map<Integer, Integer> map = helper(nums2);
- for(int i = 0; i < nums1.length; i++){
- result[i] = map.get(nums1[i]);
- }
- return result;
- }
-
- private Map<Integer, Integer> helper(int[] nums){
- Map<Integer, Integer> map = new HashMap<>();
- Stack<Integer> stack = new Stack<>();
- for(int i =0;i < nums.length;i++){
- //栈不空且当前元素大于栈顶元素
- //说明当前元素是栈顶元素的下一个更大元素
- //while循环表示当前元素是栈中所有已存在元素的下一个更大元素
- while(!stack.isEmpty() && nums[i] > stack.peek()){
- map.put(stack.pop(), nums[i]);
- }
- stack.push(nums[i]);
- }
- while(!stack.isEmpty()){
- map.put(stack.pop(), -1);
- }
- return map;
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。