给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

链接:https://leetcode-cn.com/problems/next-greater-element-i

思路:利用栈的特性,把每个元素都进行入栈处理,入栈前判断如果栈中元素比其他,则安排栈中元素出栈,这样只需要O(M+N)即可完成题目

代码如下

    public static int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        int[] result = new int[len1];
        Stack<Integer> stack = new Stack<>();
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        
        //遍历nums2,将每个元素都排入栈中,记录下他后面第一个比他大的数字
        for (int i = 0; i < len2; i++) {
            while (!stack.empty() && stack.peek() < nums2[i]) {
                hashMap.put(stack.peek(), nums2[i]);
                stack.pop();
            }
            stack.push(nums2[i]);
        }
        
        //如果哈希表中不存在,则证明没有比他大的数字
        for (int i = 0; i < len1; i++) {
            result[i] = hashMap.getOrDefault(nums1[i], -1);
        }
        return result;
    }
最后修改:2021 年 02 月 19 日
如果觉得我的文章对你有用,请随意赞赏