下一个更大的元素

给定两个没有重复元素的数组 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。

注意:

  1. nums1nums2中所有元素是唯一的。
  2. nums1nums2 的数组大小都不超过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 

 

 
 

转载于:https://www.cnblogs.com/WSWPYT/p/9691599.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值