首页 > JAVA > 当前页面

三数之和:回溯通过排序去重解法

2026-06-08 NEW个对象

🚀 三数之和(Three Sum)回溯解法深度解析

1️⃣ 问题背景

三数之和是经典的数组与回溯算法问题,核心目标是在整数数组中找到所有不重复的三元组,使其和为 0。

该问题在面试中常用于考察:搜索能力 + 去重逻辑 + 剪枝优化,属于典型中高频算法题。

2️⃣ 核心原理

本题采用 DFS 回溯思想,从数组中枚举所有可能的三元组合,并在叶子节点判断是否满足 sum = 0。

💡 核心思想:排序 + 回溯搜索 + 同层去重剪枝

3️⃣ 数据结构分析

nums[]:输入数组(已排序)
path:当前选择路径
result:最终结果集合

path 用于保存当前递归路径,当长度达到 3 时进行合法性判断。

4️⃣ 算法代码实现

完整 Java 实现如下:

class Solution {
  public List> threeSum(int[] nums) {
    List> result = new ArrayList();
    List path = new ArrayList();
    Arrays.sort(nums);
    dfs(result, nums, path, 0);
    return result;
  }

  public void dfs(List> result, int[] nums, List path, int start) {
    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️⃣ 执行流程

1. 对数组排序
2. 从 index=0 开始 DFS
3. 逐个选择元素加入 path
4. path.size == 3 时判断 sum
5. 满足条件加入 result
6. 回溯撤销选择
7. 遍历所有组合

6️⃣ 实际案例

输入:[-1, 0, 1, 2, -1, -4]
排序:[-4, -1, -1, 0, 1, 2]

输出:
[-1, -1, 2]
[-1, 0, 1]

7️⃣ 优缺点分析

  • ✅ 思路清晰,适合理解组合搜索
  • ✅ 可扩展为 kSum 问题
  • ❌ 时间复杂度 O(n³)
  • ❌ 存在大量无效搜索
❌ 工程优化通常使用“双指针法”,可降为 O(n²)

8️⃣ 面试常见问题

  • 为什么要排序?
  • 如何去重?
  • 回溯和双指针区别?
  • 如何优化时间复杂度?

核心考察点:去重逻辑 + 搜索剪枝 + 优化思维

9️⃣ 总结

🎯 核心结论:回溯解法适合理解问题本质,但工程上更推荐双指针优化版本。

相关文章

NEW个对象 NEW个对象
JAVA是世界上最好的语言

推荐文章