349 两个数组的交集

题目 两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

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

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

思路

  • 这道题目,主要要学会使用一种哈希数据结构:set,这个数据结构可以解决很多类似的问题。

  • 注意题目特意说明:输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的,同时可以不考虑输出结果的顺序

  • 那么用数组来做哈希表也是不错的选择,例如242 有效的字母异位词
    但是要注意,使用数组来做哈希的题目,是因为题目都限制了数值的大小。
    而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
    而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

代码

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        res = set()
        nums1_set = set(nums1)
        for i in nums2:
            if i in nums1_set:
                res.add(i)
        return list(res)

拓展1(set集合做交集、并集、差集运算)

# 比如 set1={1,2,3} 和 set2={3,4,5}

# 交集 取两集合公共的元素 {3}
set1 & set2
# 并集 取两集合全部的元素 {1,2,3,4,5}
set1 | set2
# 差集 取一个集合中另一集合没有的元素
set1 - set2  # {1,2}
set2 - set1  # {4,5}
# 兑成差集 取集合 A 和 B 中不属于 A&B 的元素
set1 ^ set2  # {1,2,4,5}

拓展2

  • 那有同学可能问了,遇到哈希问题我直接都用set不就得了,用什么数组啊。

  • 直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。

  • 不要小瞧 这个耗时,在数据量大的情况,差距是很明显的。

posted @ 2022-09-02 16:55  时光如你般美好  阅读(25)  评论(0编辑  收藏  举报