254 字
1 分钟
Leetcode 3sum的一种较劣的解法

https://leetcode.cn/problems/3sum

几万年没碰 OI 了,闲的没事在学校写力扣的题玩玩,看到这道题压根想不起来双指针的事,然后口胡出了一个 O(n2logn)O(n^2\log n) 的做法,过了。

具体地,考虑原式变形:numsi+numsj+numsk=0\text{nums}_i+\text{nums}_j+\text{nums}_k=0 等价于 numsi+numsj=numsk\text{nums}_i+\text{nums}_j=-\text{nums}_k。此外,对 i,j,ki,j,k 的具体下标无稳定性要求,可以对 nums\text{nums} 进行排序,容易想到对于 iijj 进行 O(n2)O(n^2) 的暴力枚举,对 kk 进行二分查找。

可以发现,这种算法复杂度为 O(n2logn)O(n^2\log n),对于极弱的 n=3000n=3000 的数据完全可过。

关于一些小细节:

  • 如何不重复 i,j,ki,j,k

    我为了不被 3000 个 0 卡掉,就将 nums\text{nums} 压缩了,每个节点为 val\text{val}——值,l\text{l}——左端点,r\text{r}——右端点,len\text{len}——区间长度。准确地,len=rl+1\text{len}=\text{r}-\text{l}+1

    好,那么如何不重复呢?很简单,你选用的点剩余长度够就行了。

  • 去重吗?

    本做法显而易见地无需去重,因为不存在可以被保存的合法答案是完全一样的。

Leetcode 3sum的一种较劣的解法
https://blog.mitufun.top/posts/leetcode-3sum的一种较劣的解法/
作者
MituFun
发布于
2026-09-06
许可协议
CC BY-NC-SA 4.0