【代码随想录】哈希表——“两个数组的交集”相关题目

349. 两个数组的交集

方法一:使用哈希数据结构:unordered_set

//使用一种哈希数据结构:unordered_set ,使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复

如下图所示,将nums1存进unordered_set之后就可直接去重

class Solution {
    //使用一种哈希数据结构:unordered_set
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> res_set;//用于存放结果
        unordered_set<int> num_set(nums1.begin(),nums1.end());//将nums1去重存放进哈希表中
        for(int num:nums2){
            if(num_set.find(num)!=num_set.end()){//num元素存在于num_set中,说明是重复元素
                res_set.insert(num);
            }
        }
        return vector<int>(res_set.begin(),res_set.end());
    }
};

方法二: 使用哈希数据结构:unordered_map

细节看注释

class Solution {
    //使用一种哈希数据结构:unordered_set
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int,int> map;
        vector<int> res;
        for(int num1:nums1){
            map[num1]++;//先将nums1放进哈希表map中
        }
        for(int num2:nums2){//遍历nums2
            if(map[num2]!=0){//发现有map[num2]不为0,表明在数组nums1中已经存在该元素,属于重复元素,符合要求
                res.push_back(num2);
                map[num2]=0;//还原为0,是避免数组nums2中有多个元素num2,会导致输出结果重复
            }
        }
        return res;
    }
};

350. 两个数组的交集 II 

使用哈希数据结构:unordered_map ,由于unordered_set会自动去重,因此就使用unordered_map

细节见注释

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int,int> map;
        vector<int>res;
        for(int num1:nums1){
            map[num1]++;//先将nums1中的元素放进哈希表
        }
        for(int num2:nums2){//遍历nums2
            if(map[num2]!=0){//数组nums2中元素num2不为0,表明是重复元素,符合要求
                res.push_back(num2);
                map[num2]--;//将重复元素减1(因为题目要求重复的也放进res中),如果后面map【num2】还不为0,说明不止重复一次
            }
        }
        return res;

    }
};

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值