3Sum — 暴力 O(n³) 到双指针 O(n²),AI 是怎么把三层循环砍成两层的?

发布时间:2026/10/23 22:28:36

3Sum — 暴力 O(n³) 到双指针 O(n²),AI 是怎么把三层循环砍成两层的? 读完本文你将了解3Sum 的暴力→优化→最优完整演进 | 双指针模式为什么是「降复杂度」的本质 | Uber 拼车配对的真实场景 题目原题给你一个整数数组nums返回所有和为 0 的不重复三元组[nums[i], nums[j], nums[k]]i ≠ j ≠ k。项目说明输入nums [-1, 0, 1, 2, -1, -4]输出[[-1,-1,2],[-1,0,1]]约束0 ≤ nums.length ≤ 3000-10⁵ ≤ nums[i] ≤ 10⁵不能返回重复三元组 先问一个问题如果你问 ChatGPT「怎么找三个数加起来等于 0」它大概率不会想「双指针」——第一反应跟大多数人一样三个 for 循环。这不是 AI 笨是问题形态太像「枚举所有组合」了。真正让它和人类一起卡住的不是找三数之和而是去重——你怎么确保不会返回两个一模一样的 [-1, 0, 1] 第一版AI 的朴素解法defthree_sum(nums):nlen(nums)resultset()foriinrange(n):forjinrange(i1,n):forkinrange(j1,n):ifnums[i]nums[j]nums[k]0:result.add(tuple(sorted([nums[i],nums[j],nums[k]])))return[list(t)fortinresult]时间 O(n³)空间 O(k)。1000 个元素就有 1.6 亿次三元组检查10000 个元素就是 160 亿次——直接超时。set 去重是事后补救先把所有组合算出来再去重等于把暴力放大再压缩纯浪费。 AI 的自我优化链第 1 次优化从「枚举三数」变成「枚举两数第三数 -a-b」固定前两个数 a、b第三个数 c -(ab)。用哈希表查 c 是否存在把 O(n³) 降到 O(n²) 平均。但去重还是要 set而且哈希表查找有常数开销实际并不快。第 2 次优化排序 双指针最优解排序后固定第一个数 nums[i]剩下用左右双指针在 nums[i1:] 上找 nums[left] nums[right] -nums[i]。和大了 right 左移和小了 left 右移。一轮 while 就解决了原本两层循环的工作。第 3 次优化排序天然去重排序带来的副产品——相同值相邻。跳过连续重复的 nums[i]、nums[left]、nums[right]不再需要 set。这才是这题真正难的地方去重不是额外步骤而是排序的副产品。暴力三重循环O(n³)哈希表找第三数O(n²) 平均排序 双指针O(n²) 稳定排序天然去重无需 set Python 实现defthree_sum(nums):nums.sort()nlen(nums)result[]foriinrange(n):ifnums[i]0:break# 排序后第一个数已 0后面不可能凑成 0ifi0andnums[i]nums[i-1]:continue# 跳过重复的第一个数left,righti1,n-1whileleftright:totalnums[i]nums[left]nums[right]iftotal0:left1eliftotal0:right-1else:result.append([nums[i],nums[left],nums[right]])whileleftrightandnums[left]nums[left1]:left1whileleftrightandnums[right]nums[right-1]:right-1left1right-1returnresult☕ Java 实现importjava.util.*;publicclassSolution{publicListListIntegerthreeSum(int[]nums){Arrays.sort(nums);ListListIntegerresultnewArrayList();intnnums.length;for(inti0;in;i){if(nums[i]0)break;if(i0nums[i]nums[i-1])continue;intlefti1,rightn-1;while(leftright){inttotalnums[i]nums[left]nums[right];if(total0){left;}elseif(total0){right--;}else{result.add(Arrays.asList(nums[i],nums[left],nums[right]));while(leftrightnums[left]nums[left1])left;while(leftrightnums[right]nums[right-1])right--;left;right--;}}}returnresult;}}两版代码放一起读者自己对比 Java 和 Python 在排序、边界、结果存储上的差异——比你讲十句都有用。 算法模式拆解双指针模式定义排序后的数组上用一个左指针和一个右指针从两端向中间逼近根据当前值的目标关系决定移动哪一边。适用信号数组/列表求两数之和、三数之和、最接近的值有序或可排序的数据需要「不重复」的组合核心逻辑每轮循环只移动一个指针所以内层是 O(n)。外层枚举第一个数是 O(n)总复杂度 O(n²)。排序后数组-4,-1,-1,0,1,2固定 i-1 (第1个)left-1, right2和-42-2 0left 右移-121 0right 左移-110 ✅记录 [-1,-1,2]left, right--重复此过程...和哈希表方案的对比维度哈希表排序双指针时间O(n²) 平均常数大O(n²) 稳定常数小空间O(n) 哈希表O(1)不计结果去重需要 set事后再处理排序天然去重同步跳过面试评分60 分90 分哈希表方案的问题是它只解决了「找不找得到」没解决「怎么不重复」。排序方案把去重变成了数据结构层面的免费午餐。️ 真实产品场景Uber 三人拼车Uber 拼车系统中有一个经典子问题给定 N 个乘客的实时位置和需求时间窗口找出所有可以同时匹配三人的拼车组合。具体化每个乘客有一个「出发时间偏移值」正数晚出发负数早出发系统需要找到三个乘客出发时间偏差之和等于 0时间窗口完全对齐。这就是 3Sum 的翻版——数组元素是乘客时间偏移找和为 0 的三元组且同一个乘客不能被匹配两次。排序 双指针的优势N10000 时暴力是 O(n³)≈1000亿次双指针是 O(n²)≈1亿次。在拼车系统的实时性要求下这 10000 倍的差距直接决定用户能不能在合理时间内等到车。✅ 面试官的点评通过标准写出排序 双指针 O(n²)正确处理三层去重外层跳重 内层左右双跳重时间 O(n²) 空间 O(1)不计结果加分项nums[i] 0提前 break 的剪枝能说明为什么「排序」是去重的关键——这题的本质不是算法是数据结构设计能推广到 K-SumK4,5…常见踩坑只在外层跳重忘了内层双指针也跳重——返回结果里还是会有重复三元组没做nums[i] 0剪枝——对大数据输入性能退化严重Java 版用new ArrayList(Arrays.asList(...))包裹因为Arrays.asList返回的列表不可修改 同类题推荐题目难度一句话思路Two Sum (LC 1)Easy排序双指针或哈希表4Sum (LC 18)Medium3Sum 外层套一层循环最接近的三数之和 (LC 16)Medium3Sum 改找最接近 target接雨水 (LC 42)Hard双指针取矮边进水量来源说明✅ 已验证LeetCode 15 官方题解 AI 实测 文档/论文《算法导论》第 4 章分治策略
延伸阅读

更多相关文章

2026/10/21 21:32:57

基于微信小程序的美食画像平台设计与实现

一、课题研究背景与意义 (一)研究背景 随着移动互联网与本地生活服务行业的高速发展,美食消费、美食探店、饮食分享已成为大众日常生活的重要组成部分。当前美团、大众点评等主流美食平台以商家入驻、榜单推荐、团购消费为核心,服…

2026/10/19 10:14:33

职场英语学习计划Day040

🌟计划1:📅学习时间:2026.8.7 周五学习内容:English at Work Episode 39: A step too far Disciplining a member of staff▶ new recruit 新员工▶ make life difficult for sb. 给某人制造困难/找麻烦/出难题&#x…

2026/10/22 16:51:49

RyzenAdj:把功耗墙从 35W 拧到 50W,只需三行命令

RyzenAdj:把功耗墙从 35W 拧到 50W,只需三行命令 【免费下载链接】RyzenAdj Adjust power management settings for Ryzen APUs 项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj F3 监控一打开,游戏帧率从 60 掉到 40&#xff…

2026/10/23 22:52:07

SpringCloud外卖系统五端源码拆解:订单状态机与抢单派单实战

简介:面向学习O2O外卖平台后端与数据库设计的中级开发者,这份压缩包提供饿了么风格系统的数据库脚本,可服务于SpringCloud微服务项目的建库建表、业务实体梳理以及课程设计或毕业设计参考。包内共3个SQL文件,压缩包约65KB&#xf…

2026/10/23 22:52:07

Python批量处理Word:自动插入图片和表格的办公脚本

简介:这份资源面向需要批量处理Word文档的Python学习者与办公自动化从业者,聚焦用python-docx库把图片和表格高效写入.docx文件,解决重复手工排版、逐份生成通知类文档的痛点,属于入门到进阶的实用技能练习。压缩包共12个文件&…

2026/10/23 22:52:07

C语言运行时栈全解析:函数调用、栈帧、递归与安全

之前排查一个模拟高并发消息网关项目X时,程序运行到深夜必定崩一次,而且崩溃的位置每次都不一样,白天测试又完全复现不出来。当时第一反应是堆被写坏了,于是把所有能开的检测都打开,结果堆一切正常。后来实在没辙&…

2026/10/23 22:52:07

ARM9 2410平台Nucleus实时内核移植与任务调度实践

简介:Nucleus for 2410 是一份面向嵌入式开发者的实时操作系统移植资料,围绕 Nucleus RTOS 在三星 S3C2410(ARM920T)平台上的移植、驱动适配与应用开发展开。资源层级清晰,涵盖硬件初始化代码、常见外设驱动&#xff0…

2026/10/23 22:52:06

CPU Roofline模型全解析:从原理到绘图,看清性能天花板

面对一坨密密麻麻的火焰图、perf stat 输出的几十个计数器、以及一次次改代码却提速不到 1.2 倍的诡异结果,我强烈建议你先停下来,别再盲目做微优化,而是建立一张属于这台 CPU 的 Roofline 模型。这东西就像一张性能“天花板图”,…

2026/10/23 22:47:05

C#电子秤数据接口中间件:多型号串口协议适配与稳定采集

简介:这份托利多中间件电子秤数据接口 C# 源码面向工业称重、自动化产线、仓储收货、零售结算等场景的开发者,重点解决电子秤重量数据采集、厂家 SDK 调用以及 RL00、BCOM 等多型号兼容问题,适合需要把称重设备接入现有业务系统的初中级 C# 开…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑