力扣【字符串专题】496. 下一个更大元素 I

120 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 4 天,点击查看活动详情

题目链接

496. 下一个更大元素 I - 力扣(LeetCode)

题目描述

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

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

对于每个 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 <= nums1.length <= nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 104
  • nums1和nums2中所有整数 互不相同
  • nums1 中的所有整数同样出现在 nums2 中

题目分析

题目有点多,总结起来,我们会有两个数组,其中 nums1 会是 nums2 的子数组。同时,nums2 的数组中的元素,都是唯一的

现在,题目的要求为,nums1 中的下标为 i 的元素 x,我们能否在 nums2 中以 x 为起点,向右遍历找到一个比他大的值;如果匹配到了这个值为 y,则修改数组 nums[i] = y;如果没有匹配到,就修改为 nums[i] = -1

因此,我们需要先遍历一次 nums2,记录下每一个值以及这个值对应的下标,使用类似 Map 的键值对结构

然后就是遍历 nums1,用 map 辅助定位到每个值在 nums2 的下标位置,然后在 nums2 向右遍历查找是否有比他大的值即可

因为我们直接在 nums1 上修改值,最后返回 nums1 即可

代码实现

完整的代码实现如下

var nextGreaterElement = function (nums1, nums2) {
    let map = {};
    nums2.forEach((n, i) => map[n] = i);
    for (let i = 0; i < nums1.length; i++) {
        let flag = true;
        let val = nums1[i];
        for (let j = map[nums1[i]] + 1; j < nums2.length && flag; j++) {
            if (val < nums2[j]) {
                flag = false;
                nums1[i] = nums2[j];
            }
        }
        if (flag) nums1[i] = -1;
    }
    return nums1;
};

image.png