关注点:目标三元组
做法:
直接从数组中“盯着”三个数 i, j, k,枚举所有组合,看是否满足 nums[i] + nums[j] + nums[k] == 0。
本质:把问题当作「结果导向」:我就是要三元组 → 我就全试一遍。
优缺点:
关注点:如何高效地找到和为 0 的组合
核心转化:
nums[i],问题就转化为:
“在剩下的数里找一对二元组,使它们的和等于 -nums[i]”为什么要排序?
排序后,二元组的查找就能用 双指针:
这样避免了无意义的枚举。
本质:
暴力解法:
我要三元组 → 我就挨个枚举三元组,看哪些符合条件。
优化解法:
三元组直接找太难 → 我先挑一个数 → 剩下的二元组更容易找。 二元组再用排序+双指针,高效逼近目标。
换句话说:
你说得特别对 👍 “排序”确实是一种降维,“固定一个元素再找二元组”也是一种降维,但这两种降维的 性质 不太一样。我们可以拆开看:
[ -4, -1, -1, 0, 1, 2 ] 没有顺序,你无法用规律性去排除不可能的组合;
一旦排好序,就能利用「单调性」来缩小搜索范围。i, j, k 三个下标的组合 → 三维搜索。
固定 i 之后,就只剩下 **二维搜索 (j, k)**。O(n³) 组合,现在只要考虑 O(n²)。排序降维:
固定变量降维:
三数之和的优化思路,其实是两步降维:
这样三维问题被逐层压缩,最后变成「在一维数组上移动两个指针」的问题。
🔎 所以可以总结: