美文网首页工作生活
P496 下一个更大的元素

P496 下一个更大的元素

作者: Spring_java | 来源:发表于2019-07-01 23:22 被阅读0次

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

    思路:

    • 两个数组都是无序的,其中数组1 是数组2 的子集。那么可以先 遍历数组2 获取数组2中每一个元素,与比该元素大的元素的hash表,
    • 然后遍历整个数组1 .在hash表中获取,存在就返回,不存在,就返回-1

    难点:

    • 使用栈,遍历数组2,第一个元素放进去,如果接下来的元素比第一个元素大,就直接放入Hash表中,其中大的元素作为value。小的元素作为key
    • 接下来遍历,如果第二个元素小,那么就继续放入,直到出现比栈顶元素大的数据,那么就栈顶元素出栈,栈顶元素作为key 要入栈元素作为value
    • 遍历数组2完毕,接下来,遍历数组1 ,从hash表中去取。存在,就返回value,不存在,就返回-1.

    代码:

            Stack<Integer> stack = new Stack<Integer>();
            HashMap<Integer, Integer> hasMap = new HashMap<Integer, Integer>();
            
            int[] result = new int[nums1.length];
            //  遍历数组2.栈顶元素小于,就出栈,作为key,比它大的就作为value
            for(int num : nums2) {
                while(!stack.isEmpty() && stack.peek()<num){
                    hasMap.put(stack.pop(), num);
                }
                stack.push(num);
            }
            
            for(int i = 0; i < nums1.length; i++) result[i] = hasMap.getOrDefault(nums1[i], -1);
                
            return result;
    
    
    

    相关文章

      网友评论

        本文标题:P496 下一个更大的元素

        本文链接:https://www.haomeiwen.com/subject/zjuocctx.html