python-leetcode-2248. 多个数组求交集

2248. 多个数组求交集 - 力扣(LeetCode)

这个问题是要找出在二维数组 nums 中所有子数组中都出现过的元素,可以通过求交集的方式来解题。具体的步骤如下:

解题思路:

  1. 初始化交集:首先将第一个子数组的所有元素作为初始的交集。

  2. 逐个遍历其他子数组:对于 nums 中的每一个子数组,更新交集,交集就是当前交集和该子数组的交集。

  3. 返回结果:最后返回交集中的元素,即是所有子数组中都出现的元素。

Python 代码:

def intersection(nums):
    # 初始化交集为第一个子数组的集合
    result = set(nums[0])
    
    # 遍历剩余的子数组,更新交集
    for num_list in nums[1:]:
        result.intersection_update(num_list)
    
    # 将结果转为列表并返回,结果是升序的
    return sorted(list(result))

解释:

  1. 使用 set(nums[0]) 将第一个子数组转换为集合,这样我们可以利用集合的 intersection_update 方法来逐个更新交集。

  2. 对于每个子数组,调用 intersection_update 方法更新交集,这会保留只在两个集合中同时出现的元素。

  3. 最终,使用 sorted 将交集转换为升序排列,并返回。

示例:

输入:

nums = [[1, 2, 3], [2, 3, 4], [2, 3, 5]]

输出:

[2, 3]

复杂度分析:

  • 时间复杂度:假设 nnums 中子数组的数量,m 是子数组的平均长度,那么每次更新交集的时间复杂度是 O(m),总体时间复杂度是 O(n * m)

  • 空间复杂度:主要取决于集合的大小,最坏情况下为 O(m),即每个子数组都需要存储集合元素。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值