力扣题:349. 两个数组的交集

题目:

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

349. 两个数组的交集

说明: 输出结果中的每个元素一定是唯一的,可以不考虑输出结果的顺序。

Python3代码解答:

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # 创建一个空的字典table来存储nums1数组中的所有元素
        table = {}
        # 遍历nums1数组,每个元素作为字典的键,值为该元素在数值中出现的次数
        for num in nums1:
            # table.get(num, 0):这部分代码尝试在字典table中查找键num
            # 如果num在字典table中存在,那么会返回num对应的值(即num出现的次数)
            # 如果num不在字典中,那么会返回默认值0
            # 将字典table中键num的值(即num出现的次数)增加1,然后更新table中num对应的值
            table[num] = table.get(num, 0) + 1

        # 创建一个空的集合,存储交集的结果
        res = set()
        # 遍历nums2数组的每个元素,检查是否在table中
        for num in nums2:
            if num in table:
                # 如果元素在字典中存在,说明在nums1数组中出现过,就把该元素添加集合res中
                res.add(num)
                # 一旦找到这个元素,就从table中删除这个元素,以避免重复查找
                del table[num]

        # 最后将res集合返回
        return list(res)

上述代码实现解释:

      上述代码的实现过程是通过哈希表(字典)存储nums1中的所有元素,然后遍历nums2数组,查找与nums1数组的交集部分,并将结果存储在集合res中,最后将集合转换为列表并返回,具体实现过程如下:

  1. 函数签名:

    • intersection是类Solution中的一个方法。
    • 它接受两个参数:nums1nums2,它们都是列表(List[int]),分别代表两个数组。
    • 函数的返回值是一个列表,其中包含两个数组的交集部分。
  2. 哈希表存储

    • 首先,函数创建了一个空的字典table来存储nums1数组中的所有元素。
    • 然后,遍历nums1数组,将每个元素作为字典的键,值为该元素在数组中出现的次数。
    • 这样做的好处是,字典table记录了nums1中所有元素,并且可以很快地判断一个元素是否在nums1中。
  3. 查找并记录交集

    • 创建一个空的集合res,用于存储两个数组的交集部分。
    • 遍历nums2数组的每个元素,检查它是否在字典table中。
    • 如果元素在字典中存在,说明它在nums1数组中出现过,就将该元素添加到res集合中。
    • 一旦找到了这个公共元素,程序就从table中删除这个元素,以避免重复查找和处理。
  4. 返回结果

    • 最后,将res集合转换成列表并返回。
    • 使用集合res来存储交集部分的好处是,可以自动去除重复元素,并保持结果的唯一性。

难点代码解释:

对于这个题目,我们不好理解的就是:table[num] = table.get(num, 0) + 1这个代码的意思,具体的解释如下:

  • 语法table[num] = table.get(num, 0) + 1这一句代码对字典table进行操作。

  • 解释:代码分为两个部分:

    • table.get(num, 0):这部分代码尝试在字典table中查找键num
      • 如果num在字典table中存在,那么会返回num对应的值(即num出现的次数)。
      • 如果num不在字典中,那么会返回默认值0,因为table.get(num, 0)中的0是指定的默认值。
    • table[num] = table.get(num, 0) + 1:这一部分将字典table中键num的值(即num出现的次数)增加1,然后更新tablenum对应的值。

如果不理解的话,我们可以将这个代码进行拆分理解:

  1. 检查元素是否在字典中

    count = table.get(num, 0) # 获取 num 在 table 中的值,如果不存在则返回 0 
    • 首先,我们通过table.get(num, 0)来获取元素num在字典table中的值(num代表一个元素(键),而这个元素在字典中对应的值是num在数组中出现的次数)。                                                                                                                                                                            注:(numtable中对应的值代表num在数组中出现的次数。如果num在数组中出现了2次,那么tablenum对应的值就是2。如果num没有出现过,或者从未被记录过,那么返回的值将是默认值0)                                                                                                          
    • get方法的第一个参数是要查找的键num,第二个参数是默认值0,如果num在字典中不存在,那么就会返回默认值0
  2. 更新元素的频次

    count += 1 # 将 num 的次数增加 1
    • 现在我们已经得到了num在字典table中的值(出现的次数count
    • 接下来,我们将这个值count1,因为我们在nums1数组中遇到了这个元素一次。
  3. 更新字典

    table[num] = count # 将更新后的次数存储回字典
    • 最后,将更新后的次数count存储回字典table中。
    • 这样num作为键,count作为值被更新到字典table中。

        将这三步合并在一起,就是table[num] = table.get(num, 0) + 1。每次遇到一个元素num时,它会检查字典table中是否已经存在这个元素,然后更新元素的频次。

本文的对于力扣349. 两个数组的交集的Python3解答,仅仅是个人学习资料记录,也十分高兴我的见解可以帮助其他的正在做这个题目的同学,基础较差,仅仅是个人见解,大神勿喷,欢迎交流,谢谢!

  • 57
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
请问您需要的是两个数组交集元素还是交集元素的数量? 如果是交集元素,可以采用双指针的方式,先将两个数组排序,然后设定两个指针 i 和 j,分别指向两个数组的开头,比较两个指针所指向的元素的大小,如果相等,则说明找到了一个交集元素,将其存到结果数组中;如果不相等,则将指向小的元素的指针向后移动一位,直到其中一个指针越界为止。 代码实现如下: ```c int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){ int i = 0, j = 0, k = 0; int* res = (int*)malloc(sizeof(int) * (nums1Size > nums2Size ? nums2Size : nums1Size)); // 排序 qsort(nums1, nums1Size, sizeof(int), cmp); qsort(nums2, nums2Size, sizeof(int), cmp); while (i < nums1Size && j < nums2Size) { if (nums1[i] == nums2[j]) { res[k++] = nums1[i]; i++; j++; } else if (nums1[i] < nums2[j]) { i++; } else { j++; } } *returnSize = k; return res; } int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; } ``` 如果是交集元素的数量,可以采用哈希表的方式,用一个哈希表来记录第一个数组中的元素出现的次数,然后遍历第二个数组,在哈希表中查找是否存在相同的元素,如果存在,则说明找到了一个交集元素,将其计数并从哈希表中删除该元素,最后返回计数结果即可。 代码实现如下: ```c int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){ int i = 0, j = 0, k = 0; int* res = (int*)malloc(sizeof(int) * (nums1Size > nums2Size ? nums2Size : nums1Size)); int* hash = (int*)malloc(sizeof(int) * 1001); // 由于目条件限制在 [0, 1000] 范围内,所以哈希表可以开得比较小 memset(hash, 0, sizeof(hash)); for (i = 0; i < nums1Size; i++) { hash[nums1[i]]++; } for (j = 0; j < nums2Size; j++) { if (hash[nums2[j]] > 0) { res[k++] = nums2[j]; hash[nums2[j]]--; } } *returnSize = k; return res; } ``` 希望这些代码能够帮到您,如有疑问请随时问我~

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又在熬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值