一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
Hi, 大家好。我是新人,程序员库里。
今后会按类分享算法题。
今天给大家分享第15道leetcode上数组中使用双指针相关的算法题。
349. 两个数组的交集
leetcode地址:leetcode-cn.com/problems/in…
难度
简单
描述
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例1
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例2
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
解释: [4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 10000 <= nums1[i], nums2[i] <= 1000
解法1
- 属于查找表的问题
- 首页使用set将两个数组去重
- 定义变量set1存储去重后的nums1,定义变量set2存储去重后的nums2
- 定义变量res,来存储两个数组的交集
- 使用for ...of 遍历 set1的keys,判断如果当set2中包含当当前遍历的key,说明这个key是两个数组的交集,就把当前的key添加到res中
- 最后res存储的就是两个数组的交集,最后返回res.
解法2
新建一个字典,遍历nums1, 填充字典 遍历nums2,遇到字典里的值就选出,并从字典中删除
解法3
首先将数组排序 定义一个数组保存结果result 两个指针分别指向两个数组的头部,每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位。如果两个数字相等,且该数字不等于result的尾部元素,同时将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束 解释下为啥与result的尾部元素比较,因为数组nums1,nums2是经过升序排序的,所以result也必然是升序的,所以新遍历的元素如果不等于result尾部元素,必然大于尾部元素,且不会与result内元素重复(因为是升序的)。
代码
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function(nums1, nums2) {
let set1 = new Set(nums1);
let set2 = new Set(nums2);
let res = [];
for(let key of set1.keys()){
if(set2.has(key)){
res.push(key)
}
}
return res;
};