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

算法:四数相加||

题目(四数相加 II)

本质是:给你 4 个数组 A、B、C、D统计有多少个四元组(i, j, k, l)满足A[i] + B[j] + C[k] + D[l] == 0

关键点

数组长度一般 ≤ 200

暴力 4 重循环是O(n^4)必超时

核心思想:把「四数相加」拆成「两数相加 + 两数相加」

这是这道题的灵魂。

数学变形

A[i] + B[j] + C[k] + D[l] = 0 ↓ (A[i] + B[j]) = -(C[k] + D[l])

也就是说:

只要某个 (a + b)等于某个 -(c + d)那么它们就能凑成 0

为什么用 unordered_map?

因为你需要做两件事:

  1. 统计 A + B 的所有可能结果

  2. 快速查找 -(C + D) 是否存在

哈希表刚好满足:

插入:O(1)

查找:O(1)

代码:

int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) { unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的次数 // 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中 for (int a : A) { for (int b : B) { umap[a + b]++; } } int count = 0; // 统计a+b+c+d = 0 出现的次数 // 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。 for (int c : C) { for (int d : D) { if (umap.find(0 - (c + d)) != umap.end()) { count += umap[0 - (c + d)]; } } } return count; }

时间复杂度分析

部分复杂度
构建 A+BO(n²)
遍历 C+DO(n²)
哈希查找O(1)
http://www.jsqmd.com/news/300239/

相关文章:

  • 如何悄悄检测单向好友?WechatRealFriends零打扰解决方案
  • BetterNCM Installer:革新网易云音乐插件管理体验的免费工具
  • CardEditor深度测评:从原理到实践的全链路解析
  • Z-Image-Turbo推理延迟高吗?端到端测试告诉你
  • DLSS Swapper智能管理工具:全方位革新游戏超采样体验
  • 5分钟解决热键冲突:Hotkey Detective高效排查指南
  • 游戏自动化工具:云顶之弈智能挂机系统的高效实现方案
  • 视频保存解决方案:N_m3u8DL-RE无会员下载与直播录制技巧全指南
  • 图像修复自动化方案:fft npainting lama批量处理实战教程
  • 如何让旧Mac重获新生:非官方升级方案全解析
  • 微博图片批量下载工具完全指南
  • 日志分析效率提升300%?这款工具让故障排查不再头痛
  • 5大革新性功能重构Windows热键管理:全场景全局快捷键占用分析解决方案
  • 热键冲突效率神器:3分钟定位Windows快捷键占用问题完全指南
  • 窗口管理革新:FancyZones带来的多显示器效率革命
  • GPT-OSS-20B实时字幕生成:流式输出部署教程
  • 5分钟部署GPT-OSS 20B,gpt-oss-20b-WEBUI镜像让本地大模型一键启动
  • 3步解锁专业级数据分析:跨平台抽卡记录工具全解析
  • 旧Mac升级完全指南:突破硬件限制的系统破解与优化教程
  • 唤醒沉睡性能:老旧Windows电脑升级技术指南
  • DLSS管理工具:突破性能瓶颈,释放显卡全部潜力
  • unet image Face Fusion文档在哪?项目结构与文件说明完整指南
  • 基于arm64 amd64的Linux发行版软件包生态对比
  • Switch大气层系统深度配置指南:从故障排查到性能优化
  • 3个技巧解锁加密音频自由:音频解密工具让音乐格式转换不再难
  • FSMN VAD常见问题全解:检测不到语音?这样排查
  • 三步激活老旧安卓设备直播解决方案:低版本系统适配指南
  • 无需GPU知识!AI图像抠图镜像开箱即用体验
  • YOLO11训练中断恢复:断点续训部署技巧
  • 4步实现3D模型高效转换:ObjToSchematic全功能操作指南