news 2026/6/15 13:58:53

​从454. 四数相加 II 中学到Counter​

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
​从454. 四数相加 II 中学到Counter​

从454. 四数相加 II 中学到Counter,我们使用哈希表(Counter将时间复杂度从暴力的 (O(n^4)) 优化到 (O(n^2))。


一、Counter的内部数据结构

Counter是什么?

  • Counter是 Python 标准库collections模块中的一个字典子类(dict subclass)
  • 它专门用于计数可哈希对象
  • 底层实现就是哈希表(hash table),和普通dict一样,基于开放寻址或链地址法(CPython 中是开放寻址)。

🔧 内部结构示例

from collections import Counter cnt = Counter(['a', 'b', 'a', 'c', 'b', 'a']) print(cnt) # 输出: Counter({'a': 3, 'b': 2, 'c': 1})

其内部存储等价于:

{'a': 3, 'b': 2, 'c': 1}
  • 键(key):元素(必须可哈希,如 int、str、tuple)
  • 值(value):该元素出现的次数(int)

💡 所以Counter插入、查询、更新操作平均时间复杂度都是O(1)


二、code 中Counter的实例分析

cnt = Counter(x + y for x in nums1 for y in nums2)

📌 这行做了什么?

  • 遍历nums1nums2的所有组合(共 (n^2) 对)
  • 计算每对的和s = x + y
  • 统计每个和s出现的次数

🧪 举个具体例子

假设:

nums1 = [1, 2] nums2 = [-2, -1]

那么x + y的所有可能为:

  • 1 + (-2) = -1
  • 1 + (-1) = 0
  • 2 + (-2) = 0
  • 2 + (-1) = 1

所以:

cnt = Counter({0: 2, -1: 1, 1: 1})

即:

cnt[-1] == 1 cnt[0] == 2 cnt[1] == 1 cnt[999] == 0 # 不存在的键返回 0(这是 Counter 的特性!)

✅ 关键优势:访问不存在的键不会报错,而是返回 0,这正是你代码中cnt[-x-y]安全的原因!


三、完整执行流程示例

输入:

nums1 = [1, 2] nums2 = [-2, -1] nums3 = [-1, 2] nums4 = [0, 2]

目标:找满足a + b + c + d == 0的元组数量。

Step 1: 构建cnt(a + b 的频次)

a+b: 1 + (-2) = -1 1 + (-1) = 0 2 + (-2) = 0 2 + (-1) = 1 cnt = {-1:1, 0:2, 1:1}

Step 2: 遍历c + d,查- (c + d)是否在cnt

c+d: -1 + 0 = -1 → 需要 a+b = 1 → cnt[1] = 1 -1 + 2 = 1 → 需要 a+b = -1 → cnt[-1] = 1 2 + 0 = 2 → 需要 a+b = -2 → cnt[-2] = 0 2 + 2 = 4 → 需要 a+b = -4 → cnt[-4] = 0 总和 = 1 + 1 + 0 + 0 = 2

✅ 返回2,正确。


四、为什么用Counter而不是普通dict

你可以用普通dict,但需要手动处理默认值:

# 手动写法(不推荐) d = {} for x in nums1: for y in nums2: d[x+y] = d.get(x+y, 0) + 1 total = 0 for x in nums3: for y in nums4: total += d.get(-(x+y), 0)

Counter自动处理缺失键为 0,代码更简洁安全:

# 你的写法(推荐) cnt = Counter(x+y for x in nums1 for y in nums2) return sum(cnt[-x-y] for x in nums3 for y in nums4)

✅ 这正是Counter在此场景下的最大价值!


五、复杂度分析

步骤时间空间
构建cnt(O(n^2))(O(n^2))(最坏所有和都不同)
遍历nums3+nums4(O(n^2))(O(1))
总计(O(n^2))(O(n^2))

远优于暴力 (O(n^4))。


总结

  • Counter基于哈希表的字典子类,用于计数。
  • 在你的代码中,它存储了nums1 + nums2所有可能和的出现次数
  • 利用Counter访问不存在键返回 0的特性,使得cnt[-x-y]安全且简洁。
  • 整体算法是空间换时间的典型应用,将四重循环降为两个双重循环。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 12:14:57

目前最好的三折叠屏手机:三星Galaxy Z TriFold何以引领体验革命?

三折叠屏手机的出现,是否意味着移动设备的终极形态已近在眼前?当消费者不再满足于单一的折叠体验,对屏幕灵活性、性能与耐用性的要求愈发苛刻,一款真正的“最好”产品该具备怎样的特质?三星Galaxy Z TriFold的到来&…

作者头像 李华
网站建设 2026/6/13 6:42:14

AI大模型应用开发学习-22【20251213】

学习内容: 👉课程主题:《Pytorch与视觉检测》 ✅ PyTorch的核心概念 PyTorch的张量与自动求导机制PyTorch的动态图与静态图 ✅ PyTorch的分布式训练在多个GPU上进行训练使用PyTorch Lightning简化模型训练 ✅ 图像识别技术与缺陷检测传统图像…

作者头像 李华
网站建设 2026/6/11 21:25:12

C++初阶9:list使用攻略

目录 前言:为什么需要list 二、基础认知:list的底层与初始化 2.1什么是list 2.2头文件与命名空间 2.3初始化方式 三、迭代器误区 四、核心操作:增删查改 4.1元素添加:push_back/push_front/insert 4.2元素删除&#xff1…

作者头像 李华
网站建设 2026/6/15 13:15:20

重构智慧书-第14条:现实与风度

一、原文呈现现实与风度肚里有真货还不能说万事大吉:你还得留心与环境相配合。风度不佳会弄得百事尴尬,连正义与正理都会让它搅得变味。如果你风度可人,往往一美遮百丑:即使回绝人的“不”字,也让人感到堂而皇之,它能使真理甘甜&a…

作者头像 李华
网站建设 2026/6/15 12:17:38

七自由度车辆动力学模型验证:基于Dugoff轮胎模型与CarSim的探索

七自由度车辆动力学模型验证(Dugoff轮胎模型,B08_01商品基础上建模) 1.软件: MATLAB 2018以上;CarSim 2020.0 2.商品介绍: 基于Dugoff轮胎模型和车身动力学公式,搭建7DOF车辆动力学Simulink模型,对相关变量…

作者头像 李华
网站建设 2026/6/11 23:21:03

整车热管理AMESim学习之旅:资料与模型探索

整车热管理amesim学习资料模型在汽车行业迈向智能化、电动化的进程中,整车热管理系统的重要性日益凸显。AMESim作为一款强大的多学科系统建模仿真平台,在整车热管理领域有着广泛的应用。今天就来和大家聊聊整车热管理AMESim学习资料以及模型相关的事儿。…

作者头像 李华