三数之和:回溯通过排序去重解法
🚀 三数之和(Three Sum)回溯解法深度解析
1️⃣ 问题背景
三数之和是经典的数组与回溯算法问题,核心目标是在整数数组中找到所有不重复的三元组,使其和为 0。
该问题在面试中常用于考察:搜索能力 + 去重逻辑 + 剪枝优化,属于典型中高频算法题。
2️⃣ 核心原理
本题采用 DFS 回溯思想,从数组中枚举所有可能的三元组合,并在叶子节点判断是否满足 sum = 0。
3️⃣ 数据结构分析
path:当前选择路径
result:最终结果集合
path 用于保存当前递归路径,当长度达到 3 时进行合法性判断。
4️⃣ 算法代码实现
完整 Java 实现如下:
public List
- > threeSum(int[] nums) {
List
- > result = new ArrayList();
List
Arrays.sort(nums);
dfs(result, nums, path, 0);
return result;
}
public void dfs(List
- > result, int[] nums, List
if (path.size() == 3) {
if (path.get(0) + path.get(1) + path.get(2) == 0) {
result.add(new ArrayList<>(path));
}
return;
}
for (int i = start; i < nums.length; i++) {
if (i > start && nums[i] == nums[i - 1]) {
continue;
}
path.add(nums[i]);
dfs(result, nums, path, i + 1);
path.remove(path.size() - 1);
}
}
}
5️⃣ 执行流程
2. 从 index=0 开始 DFS
3. 逐个选择元素加入 path
4. path.size == 3 时判断 sum
5. 满足条件加入 result
6. 回溯撤销选择
7. 遍历所有组合
6️⃣ 实际案例
排序:[-4, -1, -1, 0, 1, 2]
输出:
[-1, -1, 2]
[-1, 0, 1]
7️⃣ 优缺点分析
- ✅ 思路清晰,适合理解组合搜索
- ✅ 可扩展为 kSum 问题
- ❌ 时间复杂度 O(n³)
- ❌ 存在大量无效搜索
8️⃣ 面试常见问题
- 为什么要排序?
- 如何去重?
- 回溯和双指针区别?
- 如何优化时间复杂度?
核心考察点:去重逻辑 + 搜索剪枝 + 优化思维
9️⃣ 总结
相关文章
-
有哪些数据安全的方案?
1、锁 2、单线程,比如:redis 3、不共享变量,比如:ThreadLocal 4、原子操作,比如:AtomicInteger 5、不可变模式,比如:一旦创建不能修改,修改就会再次创建一个新的对象,String 6、读写分离,写时复制,比如:CopyOnWriteArrayList
NEW个对象 2025-02-11
-
JVM内存模型详解:从运行时数据区到GC机制彻底搞懂
JVM内存模型是Java程序运行的基础,它规定了对象、变量、方法、线程等数据在运行期间存储的位置。面试中提到的堆、栈、方法区、程序计数器、本地方法栈以及GC垃圾回收机制,都属于JVM运行时内存结构的重要组成部分。
NEW个对象 2026-06-09
-
DDD聚合根、聚合、实体、值对象如何落地?架构级实战解析
在DDD(领域驱动设计)中,聚合、聚合根、实体和值对象是核心建模概念,但真正的难点并不在“概念理解”,而在于如何在工程中正确落地。 本文从架构视角出发,结合Java工程实践,系统讲解DDD四大核心概念的落地方式。
NEW个对象 2026-06-26