持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 4 天,点击查看活动详情
题目链接
题目描述
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;
};