350. 两个数组的交集 II

题目描述

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

示例 1:

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

示例 2:

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

说明:

  • 输出结果中每个元素出现的次数应与元素在两个数组中出现的次数一致。
  • 我们可以不考虑输出结果的顺序。

解题思路

使用哈希表统计一个数组中每个元素的出现次数,然后遍历另一个数组,找到与哈希表中相同元素,将其添加到结果集中。

C#代码实现

public int[] Intersect(int[] nums1, int[] nums2) {
    // 创建一个字典,用于统计 nums1 中每个元素出现的次数
    Dictionary<int, int> dict1 = new Dictionary<int, int>();
    // 创建一个列表,用于存储结果
    List<int> result = new List<int>();

    // 统计 nums1 中每个元素的出现次数
    foreach (int num in nums1) {
        // 如果字典中已经存在该元素,则将该元素的计数加 1
        if (dict1.ContainsKey(num)) {
            dict1[num]++;
        } else {
            // 如果字典中不存在该元素,则将该元素添加到字典中,并将其计数设置为 1
            dict1[num] = 1;
        }
    }

    // 遍历 nums2,找到与 dict1 中相同的元素,将其添加到结果集中
    foreach (int num in nums2) {
        // 如果字典中存在该元素,且该元素的计数大于 0,则将该元素添加到结果集中
        if (dict1.ContainsKey(num) && dict1[num] > 0) {
            result.Add(num);
            // 将该元素的计数减 1
            dict1[num]--;
        }
    }

    // 返回结果集
    return result.ToArray();
}

C代码实现

int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    int* result = (int*)malloc(sizeof(int) * (nums1Size > nums2Size ? nums2Size : nums1Size));
    int resultSize = 0;

    int* dict1 = (int*)malloc(sizeof(int) * nums1Size);
    memset(dict1, 0, sizeof(int) * nums1Size);

    // 构建哈希表 dict1
    for (int i = 0; i < nums1Size; i++) {
        dict1[nums1[i]]++;
    }

    // 遍历数组 nums2,找到与 dict1 中相同的元素,将其添加到结果集中
    for (int i = 0; i < nums2Size; i++) {
        if (dict1[nums2[i]] > 0) {
            result[resultSize++] = nums2[i];
            dict1[nums2[i]]--;
        }
    }

    *returnSize = resultSize;
    return result;
}

时间复杂度和空间复杂度

  • 时间复杂度:O(m + n),其中 m 和 n 分别是数组 nums1 和 nums2 的长度。分别遍历两个数组一次。
  • 空间复杂度:O(m),其中 m 是数组 nums1 的长度。使用了一个哈希表。

你可能感兴趣的:(#,LeetCode,数据结构,leetcode,c#,c语言)