Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
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 。
- 示例 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 <= nums1.length <= nums2.length <= 10000 <= nums1[i], nums2[i] <= 104nums1和nums2中所有整数 互不相同nums1中的所有整数同样出现在nums2中
二、思路分析:
- 暴力解法:首先双层循环找到
nums1中每一项在nums2中的位置 - 然后再次遍历
nums2,遍历起始参数需要从上层找到的位置+1 - 最后判断遍历的当前项是否大于
nums1和nums2的交集项- 找到一个符合条件的项,添加进定义好的数组变量中,并且退出当前循环
- 没有找到符合条件的项,添加
-1
- 注意
- 值得注意就是边界问题,即
nums1中的数刚刚好在nums2的最后一个,这样右边就没有数,直接返回-1 break的使用,当找到后需要退出当前循环,避免做多余的循环操作
- 值得注意就是边界问题,即
三、AC 代码:
function nextGreaterElement(nums1: number[], nums2: number[]): number[] {
let ans: Array<number> = [];
for(let i = 0; i < nums1.length; i++){
for(let j = 0; j < nums2.length; j++){
if(nums1[i] === nums2[j]){
// 如果值刚好在nums2的最后一个,右边就没有值,添加-1
if(j === nums2.length - 1){
ans.push(-1);
break;
}
for(let n = j + 1; n < nums2.length; n++){
if(nums2[j] <= nums2[n]){
ans.push(nums2[n]);
break;
}
// 如果找到最后一个都没有找到比他大的,添加-1
if(n === nums2.length - 1 && nums2[j] > nums2[n]){
ans.push(-1)
}
}
}
}
}
return ans
};
四、总结:
- 注意一下边界问题和
break退出循环,就很容易解了 - 更多解题方式,移步题解区