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

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即可完成。

你可能感兴趣的:(LeetCode)