豆包 LeetCode 15.三数之和 Java实现
LeetCode 15. 三数之和 Java 实现题目要求找出数组中所有和为 0 的三元组且三元组不重复。核心思路排序 双指针去重处理时间复杂度 O(n²)。javaimport java.util.ArrayList;import java.util.Arrays;import java.util.List;class Solution {public ListListInteger threeSum(int[] nums) {ListListInteger res new ArrayList();int n nums.length;if (n 3) return res;// 排序方便双指针和去重Arrays.sort(nums);for (int i 0; i n; i) {// 第一个数大于0后面全是正数不可能凑出0if (nums[i] 0) break;// 跳过重复的第一个数避免重复三元组if (i 0 nums[i] nums[i - 1]) continue;int left i 1;int right n - 1;while (left right) {int sum nums[i] nums[left] nums[right];if (sum 0) {res.add(Arrays.asList(nums[i], nums[left], nums[right]));// 跳过重复的leftwhile (left right nums[left] nums[left 1]) left;// 跳过重复的rightwhile (left right nums[right] nums[right - 1]) right--;left;right--;} else if (sum 0) {left;} else {right--;}}}return res;}}关键说明1. 排序先排序是双指针的基础同时方便跳过重复元素。2. 第一层去重 nums[i] 和前一个相等时直接跳过防止重复的基准数。3. 双指针收缩- 和小于0左指针右移增大数值- 和大于0右指针左移减小数值4. 内层去重找到符合条件的三元组后跳过左右指针重复的元素避免重复结果。5. 剪枝当基准数 nums[i] 0 时后续三数之和一定大于0直接退出循环。复杂度- 时间排序 O(n log n) 双指针遍历 O(n²)整体 O(n²)- 空间O(log n)排序栈空间不计结果存储测试示例javapublic static void main(String[] args) {Solution sol new Solution();int[] nums1 {-1,0,1,2,-1,-4};System.out.println(sol.threeSum(nums1)); // [[-1,-1,2],[-1,0,1]]int[] nums2 {0,0,0};System.out.println(sol.threeSum(nums2)); // [[0,0,0]]int[] nums3 {0,1,1};System.out.println(sol.threeSum(nums3)); // []}