350. 两个数组的交集 II - 力扣(LeetCode)

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

题解

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        // 使用 unordered_map 来记录每个数字出现的次数
        unordered_map<int, int> map1;
        vector<int> result;
        
        // 统计 nums1 中每个数字出现的次数
        for (int num : nums1) {
            map1[num]++;
        }
        
        // 遍历 nums2,检查每个数字在 map1 中的出现次数
        for (int num : nums2) {
            if (map1[num] > 0) {  // 如果这个数字在 nums1 中还有剩余
                result.push_back(num);  // 加入结果数组
                map1[num]--;  // 减少一次出现次数
            }
        }
        
        return result;
    }
};

 解题思路

  • 使用哈希表(unordered_map)来记录第一个数组中每个数字出现的次数。
  • 遍历第二个数组,当遇到一个数字时,检查哈希表中这个数字的计数是否大于0,如果是,就把这个数字加入结果数组,并将哈希表中对应的计数减1。
  • 这样可以保证结果数组中的每个数字出现次数不会超过它在两个数组中出现次数的最小值。

例子

  • nums1 = [1,2,2,1], nums2 = [2,2]

  • 过程:
    - map1: {1:2, 2:2}  // 记录 nums1 中数字频次
    - 遍历 nums2 的第一个 2:map1[2]=2>0,加入结果,map1[2]变为1
    - 遍历 nums2 的第二个 2:map1[2]=1>0,加入结果,map1[2]变为0
    - 最终结果:[2,2]
Logo

科技之力与好奇之心,共建有温度的智能世界

更多推荐