每日一练leedcode-第350题-两个数组的交集 II

本文介绍了如何利用C++中的unordered_map数据结构来计算两个向量的交集。通过建立一个哈希表记录一个向量中元素的出现次数,然后遍历另一个向量,查找并验证元素在哈希表中是否存在以及计数大于0,将符合条件的元素添加到结果向量中。这种方法确保了每个元素只被添加一次,避免了重复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、思路

利用哈希表

二、解题方法

先定义一个名为 counts 的无序映射(unordered map)。unordered_map 是 C++ 标准库中的一个容器,用于实现键值对的映射关系。在这里,counts 是一个从整数类型的键(int)到整数类型的值(int)的映射。它用于记录 nums1 向量中每个元素的出现次数。

再定义一个向量result存放最终结果。

然后在nums2中查找是否存在和nums1一样的元素,若存在则存放在result中。最后将 countsnum 的计数减少一次,以便反映该元素已经在交集中被使用了一次。通过递减计数,我们可以确保每个元素只被计数一次,避免重复添加到结果中。

三、code

class Solution {

public:

    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {

        //是在代码中定义了一个名为 counts 的无序映射(unordered map)。unordered_map 是 C++ 标准库中的一个容器,用于实现键值对的映射关系。

//这里,counts 是一个从整数类型的键(int)到整数类型的值(int)的映射。它用于记录 nums1 向量中每个元素的出现次数。

//在代码的执行过程中,我们遍历 nums1 向量,对于每个元素 num,将其作为键在 counts 中查找对应的值(即出现次数),并进行更新。如果 num 在 counts 中不存在,会自动创建一个新的键值对,并将值初始化为 0。然后,我们将值加一以表示 num 的出现次数。

//通过使用 unordered_map,我们可以方便地统计元素出现的次数,并在后续的处理中使用这些计数信息来处理交集。

        unordered_map<int,int> counts;

        vector<int> result;

        for(int num:nums1)

        {

            counts[num]++;

        }

        for(int num:nums2)

        {

            if(counts.find(num) != counts.end() && counts[num]>0)//counts.find(num) 表示在 counts 中查找键为 num 的元素。find 函数返回一个迭代器,指向找到的元素位置,如果未找到,则返回迭代器指向 counts 的末尾(即 end())。

//counts.end() 表示 counts 的末尾迭代器。

//因此,counts.find(num) != counts.end() 的判断条件是,如果在 counts 中找到了键为 num 的元素,则返回 true,表示找到了;如果未找到,则返回 false,表示未找到。

//在代码中,这个判断条件用于检查 nums2 中的元素是否在 counts 中出现过。如果返回值为 true,表示找到了相应的键,即 nums2 中的元素在 nums1 中也存在,可以进行交集的处理。

            {

                result.push_back(num);

                counts[num]--;//counts[num] 表达式表示访问键 num 对应的值,然后使用 -- 运算符将其递减。这样做的目的是将 counts 中 num 的计数减少一次,以便反映该元素已经在交集中被使用了一次。

//通过递减计数,我们可以确保每个元素只被计数一次,避免重复添加到结果中。

//注意:在更新计数之前,我们需要先进行条件判断来确保 num 的计数大于零,以避免对不存在的键进行递减操作。因此添加了对 num 的计数的判断条件 counts[num] > 0。这样,只有当 num 在 counts 中存在并且计数大于零时,才将其添加到结果向量中并递减计数。

            }

        }

        return result;

    }

};

=========================================================================学到的知识:

unordered_map<int, int> counts; 是在代码中定义了一个名为 counts 的无序映射(unordered map)。unordered_map 是 C++ 标准库中的一个容器,用于实现键值对的映射关系。

通过使用 unordered_map,我们可以方便地统计元素出现的次数,并在后续的处理中使用这些计数信息来处理交集。

counts.find(num) != counts.end() 是在代码中进行查找操作的条件判断语句。

counts.find(num) 表示在 counts 中查找键为 num 的元素。find 函数返回一个迭代器,指向找到的元素位置,如果未找到,则返回迭代器指向 counts 的末尾(即 end())。

counts.end() 表示 counts 的末尾迭代器。

vector<int> result; 是在代码中定义了一个名为 result 的向量(vector)。vector 是 C++ 标准库中的一个容器,用于存储一组具有相同类型的元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值