• LeetCode_496_下一个更大元素Ⅰ


    题目链接

    题目描述

    nums1 中数字 x 的 下一个更大元素 是指 xnums2 中对应位置 右侧第一个x 大的元素。

    给你两个 没有重复元素 的数组 nums1nums2 ,下标从 0 开始计数,其中nums1nums2 的子集。

    对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1

    返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素

    示例 1

    输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
    输出:[-1,3,-1]
    解释:nums1 中每个值的下一个更大元素如下所述:
    
    - 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例 2

    输入:nums1 = [2,4], nums2 = [1,2,3,4].
    输出:[3,-1]
    解释:nums1 中每个值的下一个更大元素如下所述:
    
    - 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    提示

    • 1 <= nums1.length <= nums2.length <= 1000
    • 0 <= nums1[i], nums2[i] <= 10^4
    • nums1nums2中所有整数 互不相同
    • nums1 中的所有整数同样出现在 nums2

    进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

    解题思路

    暴力法

    • 遍历数组nums1,然后第二层for循环遍历nums2
    • 首先找到nums1[i] == nums2[j],然后再此之后寻找下一个更大的元素,如果没有就返回-1

    单调栈法

    • 单调栈里存放的元素是什么

      • 单调栈里存放的是nums2里面的元素
    • 单调栈里的元素是递增还是递增

      • 单调栈里面的元素递增顺序
    • 使用单调栈主要有三个判断条件

      • 当前遍历的元素nums2[j] == nums1[i]
        • 继续遍历下一个元素nums[j+1]
          • 如果nums2[j+1] > nums1[i],则将其入栈,并令ans[i] = nums2[j+1],并break本层循环
          • 如果nums2[j+1] < nums1[i],则将其入栈,并继续
      • 当前遍历的元素nums2[j] != nums1[i]
        • nums2[j]入栈

    AC代码

    暴力法

    class Solution {
        public int[] nextGreaterElement(int[] nums1, int[] nums2) {
            int[] ans = new int[nums1.length];
            Arrays.fill(ans, -1);
            for (int i = 0; i < nums1.length; i++) {
                for (int j = 0; j < nums2.length; j++) {
                    if (nums1[i] == nums2[j]) {
                        for (int k = j + 1; k < nums2.length; k++) {
                            if (nums2[k] > nums2[j]) {
                                ans[i] = nums2[k];
                                break;
                            }
                        }
                    }
                }
            }
            return ans;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    单调队列法

    class Solution {
        public int[] nextGreaterElement(int[] nums1, int[] nums2) {
            int[] ans = new int[nums1.length];
            Arrays.fill(ans, -1);
            Map<Integer, Integer> map = new HashMap<>();
            for (int i = 0; i < nums1.length; i++) {
                map.put(nums1[i], i);
            }
            Stack<Integer> stack = new Stack<>();
            stack.push(0);
            for (int i = 1; i < nums2.length; i++) {
                if (nums2[i] <= nums2[stack.peek()]) {
                    stack.push(i);
                } else {
                    while (!stack.isEmpty() && nums2[stack.peek()] < nums2[i]) {
                        if (map.containsKey(nums2[stack.peek()])) {
                            Integer index = map.get(nums2[stack.peek()]);
                            ans[index] = nums2[i];
                        }
                        stack.pop();
                    }
                    stack.push(i);
                }
            }
            return ans;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    Vue组件中引入jQuery
    掌握JavaScript中的迭代器和生成器,顺便了解一下async、await的原理
    数据库系列:业内主流MySQL数据中间件梳理
    【Flutter混合开发踩坑日记之‘applicationVariants‘ for extension ‘android‘】
    阿里云r7服务器内存型CPU采用
    web前端-html-css-HACK(CSS Hack 实际上指的就是一个特殊的代码,这段代码只在某些特殊的浏览器中可以识别)
    ROS数据格式转换:LaserScan转MultiEchoLaserScan
    Java23种设计模式-行为型模式之命令模式
    Java打印二进制
    智能家居灯光控制系统
  • 原文地址:https://blog.csdn.net/Fitz1318/article/details/126193322