5.15 哈希表合集—349.两个数组的交集
给定两个数组 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] 也是可通过的
我的思路:
返回交集
nums1 = [1,2,2,1], nums2 = [2,2]
map [{1 , 1} , { 2 , 2}]
map.has
解决问题:去重问题 =>set
我的代码:
function intersection(nums1: number[], nums2: number[]): number[] {// 存储的setlet set = new Set();let set2 = new Set();let ans = [];let i = 0 ; // 遍历数组当set当中for(let i = 0 ; i < nums1.length ; i++){set.add(nums1[i]);}for(let i = 0 ; i < nums2.length ; i++){set2.add(nums2[i]);}// 遍历set2判断set2的值set1是否有set2.forEach((item) => {if(set.has(item)){ans[i] = item;i++;}})return ans;
};
虽然我的代码可以成功解答,但是从时间来看耗费的时长很大,而且耗费的空间也很大。
看了一下其他人的代码对我的代码进行了更新迭代:
ts语法+答案数组最开始为set后面转化为数组
let resSet : Set<number> = new Set(nums1);//生成有nuns1的数字且不相同的setlet ansSet : Set<number> = new Set();for( let i of nums2){if(resSet.has(i)){ansSet.add(i);}}return Array.from(ansSet);
注意!
ts声明的方式:
let resSet : Set<number> = new Set(nums1);
转化为数组的方式:
Array.from(ansSet);
总结:本道题考的是对set的敏感度,我们知道set最大的优点就是不含重复的值,这对于本道题目有大大滴好处,先初始化一个对比set,后nums2是否在set中,在处理nums2进答案数组的时候,也是为了去重,我们事先将答案数组转化为set,后转化为数组的。
- new Set() : 创建一个新的 Set 对象。
- add(value) : 添加一个指定的值到 Set 对象中。
- delete(value) : 从 Set 对象中删除一个指定的值。
- has(value) : 判断 Set 对象中是否包含一个指定的值。
- clear() : 清除 Set 对象中的所有元素。
- forEach(callback[, thisArg]) : 对 Set 对象中的每一个值应用一个回调函数。
- values() / keys() : 返回一个新的迭代器对象,包含 Set 对象中的所有值(因为 Set 对象中的值是唯一的,所以 keys 和 values 返回的结果相同)。
- entries() : 返回一个新的迭代器对象,包含 Set 对象中的所有成员的键值对数组。
- size : 返回 Set 对象中的值的数量。