求两个数组的交集2

本文介绍了一种使用C++编程语言解决数组交集问题的方法,通过unordered_map统计两个数组中元素的出现次数,然后遍历第二个数组,找出在第一个数组中也存在的元素及其出现次数,从而找到最少出现次数的元素作为交集。
摘要由CSDN通过智能技术生成

解题思路:

1.统计数组中每个元素的值出现的次数,也就是每个元素出现了多少次

2.遍历一个数组 nums2,找另一个数组nums1。

3.如果当前被遍历到值 num 在nums1中存在,那么,去找 num 出现的次数。

4.在遍历时,我们需要通过查找是否出现,即

if(countMap.find(num) != countMap.end())

C++ 函数 std::unordered_map::find() 查找与键 k 关联的元素。

如果操作成功,则方法返回指向元素的迭代器,否则返回指向 map::end() 的迭代器。


声明

以下是 std::unordered_map::find() 函数形式 std::unordered_map 头的声明。

C++11

iterator find (const key_type& k);
const_iterator find (const key_type& k) const;

查看当前被遍历的元素是否出现,那么,如果 if 值为真,即表示这元素是交集,我将这个元素插入到新的数组中,遍历结束就可以得到nums2中的元素交集

5.根据题目条件,需要插入的数量因该是出现数量较少的。那么,就需要限制 if 语句的条件。根据出现次数,如果每遍历到一个值,我就将nums1中这个值的出现次数 -1 那么,当nums1中对应元素的出现次数,也就是值为 0 的时候,通过 if 为真,插入的数据就是最少的。因为nums1 和nums2的出现次数是同时消耗的,当这个计数为 0 的时候,即最少的一方被消耗完了

//遍历nums2,如果在countMap中存在,计数-1
for (auto num : nums2)
{
    if (countMap.find(num) != countMap.end() && countMap[num] > 0) 
    {
        result.push_back(num);
        countMap[num]--;
    }
}

 完整代码:

// 两个数组的交集2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<vector>
#include <unordered_map>
using namespace std;


class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
    {
        unordered_map<int, int>countMap;
        //先统计nums1中每个元素出现的次数
        for (auto num : nums1) {
            countMap[num]++;
        }

        vector<int>result;

        //遍历nums2,如果在countMap中存在,计数-1
        for (auto num : nums2) {
            if (countMap.find(num) != countMap.end() && countMap[num] > 0) {
                result.push_back(num);
                countMap[num]--;
            }
        }
        return result;
    }
};

int main() {
    Solution solution;

    // 测试1
    vector<int> nums1 = { 1, 2, 2, 1 };
    vector<int> nums2 = { 2, 2 };
    vector<int> result1 = solution.intersect(nums1, nums2);
    cout << "测试1: ";
    for (int num : result1) {
        cout << num << " ";
    }
    cout << endl;

    // 测试2
    vector<int> nums3 = { 4, 9, 5 };
    vector<int> nums4 = { 9, 4, 9, 8, 4 };
    vector<int> result2 = solution.intersect(nums3, nums4);
    cout << "测试2: ";
    for (int num : result2) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值