两个数组的交集 II

题目:

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

解:

思路:
方法一:

使用哈希表。
始终使前一个数组为长度小的,后一个为数组长度大的。
外层遍历小数组,内层遍历大数组。判断二者元素的值,分为三种情况:
1、外层 != 内层,不做任何操作,继续遍历
2、外层 = 内层,且不存在哈希表中,将该元素添加到哈希表中,为键,对应的值为 1,结束此次内层循环
3、外层 = 内层,且已经存在哈希表中,因为此时内层元素是重复遍历,应该跳过重复该元素的次数即哈希表中该元素的值,
4、外层 = 内层,且已经存在哈希表中,但已经通过步骤 3 跳过了重复元素,如果还有相等的元素,则哈希表中对应值 加 1
!在这里插入图片描述
代码:

vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
{
    hash_map<int, int> hm;
    hash_map<int, int> ::iterator itmap = hm.begin();
    vector<int> nums3;
    if (nums1.size() > nums2.size())
    {
        nums3 = nums2, nums2 = nums1, nums1 = nums3;    // 1 为个数小的 2为个数大的
    }
    for (int i = 0;i < nums1.size();i++)
    {
        int tag = hm[nums1[i]];
        for (int j = 0;j < nums2.size();j++)
        {
            
            // 如果1 中的值在2 中也有,并且没有在 哈希表中,就添加进去
            if (nums1[i] == nums2[j] && hm[nums1[i]] == 0)
            {
                hm[nums1[i]] = 1;
                break;
            }
            // 如果1 中的值在2 中也有,但哈希表已经存在,且已经记过数
            else if (nums1[i] == nums2[j] && hm[nums1[i]] != 0 && tag != 0)
            {
                tag--;
                continue;
            }
            // 如果1 中的值在2 中也有,但哈希表已经存在,就对应值 +1
            else if (nums1[i] == nums2[j] && hm[nums1[i]] != 0 && tag == 0)
            {
                int key = hm[nums1[i]] + 1;
                hm[nums1[i]] = key;
                break;
            }
        }
    }
    // 将结果写入 vector
    nums3.clear();
    itmap = hm.begin();
    while (itmap != hm.end())
    {
        for (int i = 0;i < itmap->second;i++)
        {
            nums3.push_back(itmap->first);
        }
        //cout << itmap->first << "  " << itmap->second << "\n";
        itmap++;
    }
    return nums3;
}

在这里插入图片描述

方法二:
将数组1、2进行排序,并使用 STL 的OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result) 求交集函数直接获取结果

代码:

vector<int> intersect1(vector<int>& nums1, vector<int>& nums2) 
{
    sort(nums1.begin(), nums1.end());
    sort(nums2.begin(), nums2.end());
    vector<int> result;
    set_intersection(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), back_inserter(result));
    return result;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值