15. 三数之和 3Sum
Given an array nums
of n integers, are there elements a, b, c in nums
such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Notice that the solution set must not contain duplicate triplets.
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
方法:排序加双指针
先对数组进行排序,对于重复的数据,不再处理
当我们需要枚举数组中的两个元素时,如果我们发现随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法
所以三重循环,保持第二重循环不变,而将第三重循环变成一个从数组最右端开始向左移动的指针
public List<List<Integer>> threeSum(int[] nums) { int n = nums.length; Arrays.sort(nums); List<List<Integer>> ans = new ArrayList<>(); for (int first = 0; first < n; first++){ if(first > 0 && nums[first] == nums[first -1]){ continue; } int third = n - 1; int target = -nums[first]; for (int second = first + 1; second < n; second++){ if(second > first + 1 && nums[second] == nums[second - 1]){ continue; } while (second < third && nums[second] + nums[third] > target){ third--; } if (third == second) break; if(nums[second] + nums[third] == target){ List<Integer> list = new ArrayList<>(); list.add(nums[first]); list.add(nums[second]); list.add(nums[third]); ans.add(list); } } } return ans; }
参考链接:
https://leetcode.com/problems/3sum/
https://leetcode-cn.com/problems/3sum