力扣13:两个数组的交集(没限制数组长度及元素大小)

题意:给定两个数组,编写一个函数来计算它们的交集。

那么用数组来做哈希表也是不错的选择,例如242. 有效的字母异位词(opens new window)

但是要注意,使用数组来做哈希的题目,是因为题目都限制了数值的大小。

而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。

而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

那么就可以考虑用set来做,效率最高最常用的就是unordered_set

unordered_set和vector一样也是一种容器,在定义的时候也是显示定义。

例如:unordered_set<int> result_set;

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set; // 定义result_set存放结果,之所以用set是为了给结果集去重
        unordered_set<int> nums_set(nums1.begin(), nums1.end());//把数组nums1的值存入nums_set。
        for (int num : nums2) //这行代码使用了C++11中的范围-based for 循环,可以在不需要索引的情况下遍历一个容器中所有元素。在这里,对nums2中的每个元素都执行一次循环体,每次迭代时将当前元素赋值给变量num。
        { 
            // 发现nums2的元素 在nums_set里又出现过,容器的find函数,如果要寻找的元素在该容器中出现,就返回指向该元素的迭代器(即!=nums_set.end()),if条件满足。把该元素插入到result_set。如果如果find函数要寻找的元素没有在容器中,就会返回指向集合末尾的迭代器,即等于nums_set.end(),if判断条件不成立,进行下一次for循环。
           if (nums_set.find(num) != nums_set.end()) 
            {
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end()); //要求返回数组,则把结果set的元素复制到数组里面。这行代码是在函数中使用了匿名对象。在C++中,可以使用匿名对象来直接作为函数的返回值。匿名对象是在函数返回时创建的临时对象,它不需要被命名,因为它的生命周期仅限于这个语句。
        }
};

注意:

1.第一次使用unordered_set这个容器,对其如何定义以及初始化跟vector类似。

2.for循环中的-based for循环,可以在不需要索引的情况下,把目标容器的元素依次赋值给定义的变量,对定义好的哈希表进行遍历哈希表中的所有元素很方便。

3.利用容器的find函数,来判断该容器中是否存在要查找的元素,如果存在返回该元素的迭代器,不存在返回容器.end()。

总结:本题是结合unordered_set与哈希表的经典案例,哈希表就是想判断容器中的某个元素是否存在。该题目的实质就是想判断数组1的元素是否在数组2中存在,如果存在就添加到交集集合中。

先把数组1的所有元素放到哈希表nums_set中,然后对数组2进行遍历,用nums_set.find(num)函数来判断数组2的元素是否在哈希表中。

出自:代码随想录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会编程的屁屁桃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值