当前位置: 首页 > news >正文

​从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]安全且简洁。
  • 整体算法是空间换时间的典型应用,将四重循环降为两个双重循环。
http://www.cnnetsun.cn/news/53216.html

相关文章:

  • 耐用折叠屏手机推荐:三星Galaxy Z TriFold如何破解“折痕与耐用”难题?
  • 前端技术风险防控:以防为主,防控结合
  • 给女神发“在吗”,她回了个表情包是几个意思?—— 硬核探讨TCP 三次握手
  • 入门大模型必知的100个基础问题(附简明答案)
  • vue基于Spring Boot的建筑材料管理系统的应用和研究_ug8y52z3
  • 【大模型】-LangChain--RAG文档系统
  • 探索非线性电液伺服系统的模型自适应反步控制
  • 降AI率就要牺牲文笔?WriterPro第一个不服!实测对比比原文写得还好,这文笔简直绝了
  • 我不是这样
  • 10.8 总结
  • 列车售票|基于springboot 列车售票系统(源码+数据库+文档)
  • AI驱动的手动测试变革:赋能而非替代
  • 【奶茶Beta专项】【LVGL9.4源码分析】09-core-group
  • 网络安全异想天开(不定期更新)
  • 《CAPL脚本实现CANOE工具 Bus-Off自动恢复(含重试机制)》
  • 力扣1965-丢失信息的雇员
  • Flutter 测试全栈指南:从单元测试到黄金路径验证的工程化实践
  • EtherCAT 逐帧报文解析:配置SM/FMMU
  • Springboot连锁火锅店餐饮管理系统h2dg0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • Windows系统文件wavemsp.dll丢失或损坏的问题 下载修复
  • Windows系统文件wdi.dll缺失或损坏问题 下载修复
  • 基于风险演进的智能测试策略设计
  • 论文查重焦虑成流量密码?虎贲等考 AI 直接用免费模式,打破行业游戏规则
  • vue基于Spring Boot的高职院校贫困生困难生智慧关爱系统的开发_f0txl8vu
  • AI 写论文哪家强?虎贲等考 AI!毕业论文全链路 “超级哇塞”,开题到答辩一路开挂~
  • Coze平台指南(1):coze平台概览与测试应用展望
  • 生物识别系统的测试安全性与漏洞防护实践
  • 我终于停止写 JUnit 了!用 JavaParser + GPT-4 自动生成 90% 覆盖率的单元测试
  • 源码读不下去?阿里架构师教你“三步走”阅读法,彻底告别“打开源码就犯困”
  • 大梵公考:国考省考每一年的岗位一样吗?