LeetCode 350. Intersection of Two Arrays II 题解(C++)

本文提供LeetCode350题的C++解答方案,利用unordered_map统计数组nums1中各元素出现次数,遍历nums2并匹配,同时讨论了排序优化及不同场景下的算法选择。

LeetCode 350. Intersection of Two Arrays II 题解(C++)


题目描述

  • Given two arrays, write a function to compute their intersection.

举例

  • Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2].

补充

  • Each element in the result should appear as many times as it shows in both arrays.
  • The result can be in any order.

思路

  • 使用STL的关联容器unordered_map,对数组num1遍历,把每个元素出现的次数记录map里;
  • 对数组num2遍历,若该元素能在map表中找到,且该元素在map中对应的值大于0,则该元素进入结果数组,并使该元素在map中对应的值自减1。

代码

class Solution
{
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
    {
        unordered_map<int, int> hashMap;
        for (auto num : nums1)
        {
            hashMap[num]++;
        }
        vector<int> result;
        for (auto num : nums2)
        {
            if (hashMap.find(num) != hashMap.end() && hashMap[num] > 0)
            {
                result.push_back(num);
                hashMap[num]--;
            }
        }
        return result;
    }
};

Follow up

  • What if the given array is already sorted? How would you optimize your algorithm?
    假设按照升序排列,设置两个指针i,j分别指向数组num1,num2,之后对两个指针所指的元素进行比较,若num1[i]=num2[j],则该数为交集,push进结果数组,若num1[i]>num2[j],则j指针向后移动,若num1[i]< num2[j],则i指针向后移动。
  • What if nums1’s size is small compared to nums2’s size? Which algorithm is better?
    若排好序,则使用排好序的算法,若未排序,则使用map的算法。
  • What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?
    使用上面的map即可完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值