题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[ [-1, 0, 1], [-1, -1, 2] ]
分析
这个题O(n2)的算法比较容易写,但是每个优化的地方你都得想出来,否则会超时。我这里用的是双指针法。
代码
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> re = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
//即三个数字都大于 0,在此之后不可能找到组合了;
if (nums[i]>0) break;
//去重
if (i>0 &&nums[i] == nums[i-1]) continue;
int target = -nums[i];
int start = i+1, end = nums.length-1;
while (start<end){
int sum = nums[start] + nums[end];
if (sum == target){
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(target - nums[end]);
list.add( nums[end]);
re.add(list);
//去重
while (start < end && nums[end] == nums[--end]);
while (start < end && nums[start] == nums[++start]);
}
//去重
if (sum > target){
while (start < end && nums[end] == nums[--end]);
}
if (sum < target){
while (start < end && nums[start] == nums[++start]);
}
}
}
return re;
}