3.349. 两个数组的交集

思路:

是数字,不太好用计数数组。用unordered_set去重。用范围for

std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。

 那有同学可能问了,遇到哈希问题我直接都用set不就得了,用什么数组啊。

直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。

不要小瞧 这个耗时,在数据量大的情况,差距是很明显的。

所以要考虑unordered_set  

三种数据结构的底层:

 

std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树.

红黑树是一种平衡二叉搜索树,所以key值是有序的。

但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。 

unordered_map,map,multimap也是类似的底层。

储备:

代码随想录

问题重点:

1、
注意容器的应用。范围for,迭代器初始化,临时容器,等等。

最后:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> res;
        unordered_set<int> nums(nums1.begin(),nums1.end());//用迭代器,换个容器存储
        //用范围for遍历容器
        for (int i:nums2) {
            if (nums.find(i)!=nums.end()) {//找得到的话
                res.insert(i);
            }
        }
        return vector<int>(res.begin(),res.end());//临时容器。
    }
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值