给定两个没有重复元素的数组 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知识可以看此篇博客)的知识解决:
因为第一个数组里面的元素一定在第二个数组里面,所以对第二个数组进行处理;利用栈的知识,依次让第二个数组里面元素入栈,如果碰到要入栈的数比栈顶元素大的情况,则运用hashMap(key,value),hashMap()存储的是一个键值对,我们将此时比栈顶大的数作为‘值’,此时的栈顶作为‘键’存储到hashMap中,并将这个大的数入栈,最后依次循环直至完成遍历第二个数组;
为什么要这样存储键值呢?
因为,我们要得出结果,是去比较第一个数组和第二个数组里面的元素,直至在第二个数组里面找到比第一个数组里面小的元素,找不到则输出-1;那么我们最后只需要去hashMap里面寻找‘键值对’,此时的‘键’如若是第一个数组里面的元素,则它对应的‘值’就是要求的结果,当然也会存在一些‘键值对’,它们的‘键’不属于第一个数组而是属于第二个数组;如果第一个数组里面的元素在‘键值对’里面没有找到相等的‘键’,则输出-1;
画个图具体分析过程:
nums1 = {4, 1, 2} nums2 = {1, 3, 4, 2}
1入栈
3准备入栈,和1比较,3比1大,则把1作为‘键’,3作为‘值’存入hashMap中&