LeetCode349 两个数组的交集
https://leetcode.cn/problems/intersection-of-two-arrays/
学习内容
给两个数组,返回这两个数组的交集。如一个数组是22946,一个数组是1221,这两个数组的交集是2。
用数组来保存交集,可能会没有去重。交集为元素2就可以了。
这道题目用set来解决的一个比较好的题目。
用数组来做哈希比较合适。用数组来做哈希表解决了一个题目。用set来解决一个问题。遇到哈希表题目,什么时候用set,数组,map。
没有数值的限制,数值很大,想做哈希映射时,用数组就不合适了。会浪费很多存储空间。为啥会想到用哈希表的方式解决。
哈希表最擅长解决,给你一个元素,判断在这个集合是否出现过。
具体是用set、map还是数组,具体情况分析。
数值不大,数值很分散,这种情况用set比较合适。
这个题目用set解决,一般使用哈希法时,判断这个元素在集合里出没出现过。求两个数组的交集。把第一个数组,number1,转化为哈希表。
给它放在哈希表里,把这里面的所有数值放在哈希表里,然后遍历number2,然后再在哈希表里去查,每一个元素是否在哈希表中出现过。如果出现过,最终放进result集合里。最终集合是去重的。
思路:number1处理,转化成哈希表的形式,来存numbers1里面的元素。然后再用numbers2的每一个元素,去查询在哈希表是否出现过,出现过则放入result的集合中。
选哈希结构,用set来进行解决。
先定义一个result集合,因为是要去重的。定义个set做result。
set result
再选择哈希表,也用unorderedset,number size。直接把numbers1做个初始化,转变为set里的存储结构。
set(nums1)
遍历nums2的set过程:
for(i=0;i<nums2.size;i++){
if (numsset.find(nums2[i])!=numsset.find(c1))
//如果找到了这个元素,放入集合
result.insert(nums2[i])
// 不去做去重操作
}
return vector(set)
数组解决法: 哈希表用数组。定义一个多大的哈希表就够了。定义一个数组1005,稍微大一点的哈希数组。
// 存放集合还是set
set result
// 把nums1遍历成数组
// 先定一一个哈希数组:1005
int hash[1005] = {0}
hash[nums1[i]]=1
// 哈希数组记录了nums1中所有出现过的元素
// 出现过的都是1。
// 遍历nums2
for(i=0;i<nums2.size;i++)
if(hash[nums2[i]]==1)
result.insert(nums2[i])
// result有个自然去重操作