给定两个没有重复元素的数组 nums1
和 nums2
,其中nums1
是 nums2
的子集。找到 nums1
中每个元素在 nums2
中的下一个比其大的值。
nums1
中数字 x 的下一个更大元素是指 x 在 nums2
中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
示例 2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于num1中的数字2,第二个数组中的下一个较大数字是3。
对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。
注意:
nums1
和nums2
中所有元素是唯一的。nums1
和nums2
的数组大小都不超过1000。
通过此题掌握栈的用法
题目分析:
给定两个数组,第一个数组是第二个数组的子集,说明第一个数组里面的元素都在第二个数组里面;依次扫描第一个数组里面的元素,去第二个数组里面找到第一个比此数大的数,存储;如果没有比此数大的数,则存储-1;最后输出的结果的长度一定是和第一个数组大小相等。
解决此题可以通过栈的知识和hashMap(hashMap的知识可以Google了解)的知识解决:
因为第一个数组里面的元素一定在第二个数组里面,所以对第二个数组进行处理;利用栈的知识,依次让第二个数组里面元素入栈,如果碰到要入栈的数比栈顶元素大的情况,则运用hashMap(key,value),hashMap()存储的是一个键值对,我们将此时比栈顶大的数作为‘值’,此时的栈顶作为‘键’存储到hashMap中,并将这个大的数入栈,最后依次循环直至完成遍历第二个数组; 为什么要这样存储键值呢? 因为,我们要得出结果,是去比较第一个数组和第二个数组里面的元素,直至在第二个数组里面找到比第一个数组里面小的元素,找不到则输出-1;那么我们最后只需要去hashMap里面寻找‘键值对’,此时的‘键’如若是第一个数组里面的元素,则它对应的‘值’就是要求的结果,当然也会存在一些‘键值对’,它们的‘键’不属于第一个数组而是属于第二个数组;如果第一个数组里面的元素在‘键值对’里面没有找到相等的‘键’,则输出-1; 画个图具体分析过程:代码实现:
1 public int[] nextGreaterElement(int[] nums1, int[] nums2) 2 { 3 Stack<Integer> stack = new Stack<>(); 4 Map<Integer, Integer> map = new HashMap<>(); 5 6 for (int num : nums2) 7 { 8 //1. 栈不为空 9 //2. 栈顶元素,小于当前的nums2的元素 10 while(!stack.isEmpty() && stack.peek()<num) 11 { 12 //map.put(栈顶元素,num) 13 //可能会生成很多个不同的key对应同一个value 14 map.put(stack.pop(),num); 15 } 16 //把元素压栈 17 stack.push(num); 18 } 19 20 int[] res = new int[nums1.length]; 21 22 //判断map里面是否有nums1的key,没有值则赋value为-1,有则不改变,最终并返回value 23 for (int i = 0; i < nums1.length; i++) 24 { 25 res[i] = map.getOrDefault(nums1[i], -1); 26 } 27 28 return res; 29 }
主函数:
1 public static void main(String[] args) 2 { 3 T5 t = new T5(); 4 int[] a = t.nextGreaterElement(new int[]{4,1,2}, new int[]{1,3,4,2}); 5 for (int i = 0; i < a.length; i++) 6 { 7 System.out.print(a[i] + " "); 8 } 9 }
运行结果:
1 -1 3 -1