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.
Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
题目
给定一个数组,是否存在a,b,c三个元素,使得a+b+c=0,找出所有符合条件的组合。
思路
首先将数组排序,排好以后,我们先固定一个数,然后两对撞指针找剩下俩数,所以需要两重循环。
有一些减少循环计算的细节,首先三个数加起来为0,其中肯定有负数,数组又是排好序的,所以我们一上来判断一下选定的值是否大于零,若不是就不用往下找了。
其次,题目要求不能有重复的组合,所以我们在选定一个数后,判断一下和他上一个数一样不,一样的话有可能会产生相同组合,所以就continue。
代码
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<List<Integer>>();
int len = nums.length;
for (int i = 0; i < nums.length; i++) {
if (nums[i]>0) {//因为数组排好序了,如果当前数都大于0,后面肯定都大于0,就不用找了
break;
}
if (i>0&&nums[i]==nums[i-1]) {//为了避免结果集中组合重复
continue;
}
int begin = i + 1;//两头往中间找
int end = len - 1;
while (begin<end) {
int sum=nums[i]+nums[begin]+nums[end];
if (sum==0) {
res.add(Arrays.asList(nums[i],nums[begin],nums[end]));
begin++;
end--;
while (begin < end && nums[begin] == nums[begin - 1])
begin++;
while (begin < end && nums[end] == nums[end + 1])
end--;
}else if(sum>0){
end--;
}else {
begin++;
}
}
}
return res;