LeetCode 350. 两个数组的交集 II|Python 解法详解

LeetCode 350. 两个数组的交集 II|Python 解法详解

CSDN 算法专题 · 数组与哈希表 | 难度:简单

题目信息

题目描述

返回两个数组的交集,每个元素出现次数应等于它在两个数组中出现次数的较小值。

示例

text 复制代码
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

约束

数组长度不超过 1000。

解题思路

核心观察

统计较短数组的元素频次,再扫描另一个数组。若当前值剩余次数大于 0,就加入答案并把次数减一,从而严格控制重复数量。

推导与执行步骤

  1. 统计一个数组的频次
  2. 扫描另一个数组
  3. 命中正频次时加入结果
  4. 对应计数减一

为什么这个方法正确

算法始终围绕上述核心观察维护有效状态,并且每一步只排除已经能够证明不可能产生更优答案的情况。按照执行步骤处理后,所有可能影响答案的元素或节点都会被恰好检查,因此不会遗漏合法答案;状态更新又严格遵守题目约束,所以最终结果有效。

从边界看,空区间、单个元素、全部相同或完全不匹配等情况都会落入初始化条件或循环终止条件,不需要依赖未定义状态。实现时再重点检查下标、空节点和重复元素,即可保证算法在极端输入下仍然成立。

Python 代码

python 复制代码
# 解法核心:统计较短数组的元素频次,再扫描另一个数组。若当前值剩余次数大于 0,就加入答案并把次数减一,从而严格控制重复数量。
# 实现步骤:
# 1. 统计一个数组的频次
# 2. 扫描另一个数组
# 3. 命中正频次时加入结果
# 4. 对应计数减一

from collections import Counter
from typing import List

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        if len(nums1) > len(nums2):
            nums1, nums2 = nums2, nums1
        counts = Counter(nums1)  # 频次表记录每个元素还可以匹配多少次
        result = []  # 保存最终答案
        for value in nums2:
            if counts[value] > 0:
                result.append(value)
                counts[value] -= 1
        return result

复杂度分析

  • 时间复杂度:O(n+m)
  • 空间复杂度:O(min(n,m))

易错点

不能直接使用集合,否则会丢失重复次数。

总结

这道题的关键是:统计较短数组的元素频次,再扫描另一个数组。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

相关推荐
阳明山水2 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技3 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算
Tongzhi20263 小时前
通芝科技考勤软件三大发展趋势:AI大模型、无感识别与数据底座
大数据·科技·算法·爬山算法
智购科技自动售卖机厂家3 小时前
2026自动售货机库存热力图分析:从设备分布到补货优先级的数据可视化实践~YH
大数据·python·信息可视化
eBest数字化转型方案3 小时前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
鹿鹿学长3 小时前
微软把语音转写打到 0.1 美元/小时:5 个月降价 72%,AI 音频进入地板价时代
python·自动化
weixin_440730503 小时前
使用pytest中方法控制执行步骤(test_begin.py、test_end.py,@pytest.mark.run(order=1))
开发语言·python·pytest
小柯南敲键盘4 小时前
跨境电商批量图片翻译与视频字幕翻译,就用跨马AI工具
大数据·人工智能·python·音视频
residual_fan4 小时前
持续对比强化学习(Continual Contrastive Reinforcement Learning)论文分享
人工智能·算法·数据挖掘·数据分析