三数之和问题
三数之和(3Sum)是一个经典的算法问题,通常描述为:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a, b, c,使得 a + b + c = 0?找出所有满足条件且不重复的三元组。
解决方案
方法一:排序 + 双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
function threeSum(nums) { nums.sort((a, b) => a - b); const result = []; const n = nums.length; for (let i = 0; i < n - 2; i++) { if (i > 0 && nums[i] === nums[i - 1]) continue; let left = i + 1; let right = n - 1; while (left < right) { const sum = nums[i] + nums[left] + nums[right]; if (sum < 0) { left++; } else if (sum > 0) { right--; } else { result.push([nums[i], nums[left], nums[right]]); while (left < right && nums[left] === nums[left + 1]) left++; while (left < right && nums[right] === nums[right - 1]) right--; left++; right--; } } } return result; } ```
|
算法分析
- 时间复杂度:O(n²) - 排序需要 O(n log n),双指针遍历需要 O(n²)
- 空间复杂度:O(1) 或 O(n) - 取决于排序算法的实现
关键点总结
排序:使我们可以使用双指针技巧
外层循环:固定第一个数nums[i]
内层双指针:
和的计算:
- sum < 0 → 需要更大的数 → left++
- sum > 0 → 需要更小的数 → right–
- sum = 0 → 找到解
跳过重复:确保结果中没有重复的三元组
通过这样一步步的图解,你应该能更清楚地理解三数之和的解法了。