算法day15 两个数组的交集

题目描述

思路一:set
对于交集问题,我们很自然的会考虑到收集元素时的唯一性问题,那么自然也会想到数据结构set,它与数学中集合的概念相同,对于存储的元素去重。所以我们可以使用set,这里为了实现效率,可以选择unordered_set,它是由哈希函数映射实现的,查询效率高。我们先将第一个数组赋给unordered_set容器,随后对第二个数组进行遍历,将能在数组1中找到的相同元素插入一个新的unordered_set。注意到返回值类型是vector,所以最后注意将结果集合赋值给一个vector数组返回。

代码如下

    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    unordered_set<int> result;
    unordered_set<int> nums_set(nums1.begin(),nums1.end());
    int len = nums2.size();
    for(int i=0;i<len;i++){
        if(nums_set.find(nums2[i])!=nums_set.end()){
            result.insert(nums2[i]);
        }
    }
    vector<int> vec(result.begin(),result.end());
     return vec;
}

时间复杂度:O(nums1.size()+nums2.size()+k(set转vector))
空间复杂度:O(k+sizeof(result))

思路二:数组

题目中提示,对于这道题的元素,其取值范围在[0,1000],所以我们可以考虑数组哈希的方法。我们可以创建一个大小为1000往上一点的哈希数组,随后对第一个数组进行遍历,以哈希的思想,将第一个数组对应的元素作为哈希数组的index,使其自增。随后对第二个数组进行遍历,将第二个数组的元素也作为哈希数组的位序,判断哈希数组中以第二个数组的元素作为位序的元素的值是否大于或等于一从而选择是否对应的第二个数组元素插入unordered_set中,最后以vector形式返回。

代码如下

 vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
 int hash[1001];
 unordered_set<int> result;
 for(int i=0;i<nums1.size();i++){
    hash[nums1[i]]++;
 }   
 for(int j=0;j<nums2.size();j++){
    if(hash[nums2[j]]!=0){
        result.insert(nums2[j]);
    }
 }
 
vector<int> vec(result.begin(),result.end());
 
return vec;
}

时间复杂度:O(nums1.size()+nums2.size()+k(set转vector))
空间复杂度:O(k(set转vector))

END

posted on 2025-04-20 11:09  sakura430  阅读(10)  评论(0)    收藏  举报