目录
法一、数组
(1)思路
法二、使用unordered_set
(1)注意
(2)思路
①先创建一个unordered_set对象nums_set,把nums1复制给它
②然后遍历nums2,判断nums2中的元素是否在nums1中出现
③如果找到就把nums2中的元素插入新创建的目标容器result_set
法一、数组
/*** Note: The returned array must be malloced, assume caller calls free().*/int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){int Hash[1005]={0};//哈希数组int lessSize=nums1Size<nums2Size?nums1Size:nums2Size;//?:运算大小int * result = (int *) calloc(lessSize, sizeof(int));//calloc(大小,类型),不用计算大小,返回数组初始化为0int returnIndex=0;for(int i=0;i<nums1Size;i++){Hash[nums1[i]]=1;}for( int i=0;i<nums2Size;i++){if(Hash[nums2[i]]==1){result[returnIndex++]=nums2[i];Hash[nums2[i]]=0;}}*returnSize=returnIndex;return result;}
(1)思路
①要找出两个数组的交集,只需要将第一个数组元素映射到hash表中,出现就将数组元素数值对应hash表下标的元素置为1(不管出现几次),结果就是hash表数值为1的元素下标代表着第一个数组出现过的数字;
②然后依次遍历第二个数组,将数组元素数值对应hash表下标的元素为1,就代表第二个数组也出现第一个数组出现的元素,于是存入目标数组,并将该hash数字对应数值置0,避免重复存入目标数组;
法二、使用unordered_set
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int>result_set;unordered_set<int>nums_set(nums1.begin(),nums1.end());for(int num:nums2){if(nums_set.find(num)!=nums_set.end()){result_set.insert(num);}}return vector<int>(result_set.begin(),result_set.end());
}
};
(1)注意
unordered_set是无序集合容器,有唯一的key值使用unordered是为了去重
传入的vector容器是不存在去重功能的
(2)思路
①先创建一个unordered_set对象nums_set,把nums1复制给它
begin()返回容器第一个元素地址
end()返回容器最后一个元素后一个地址
②然后遍历nums2,判断nums2中的元素是否在nums1中出现
find()如果找到就返回该容器中元素的地址,如果找不到就返回和end()一样的地址
③如果找到就把nums2中的元素插入新创建的目标容器result_set
insert()往容器插入元素