Given an array S of n integers, are there elements a, b, c in S 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.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
/*
* 思路:
* 题目意思为: a+b+c=0; 也即可以转化为a+b=0-c,但固定其中一个的时候,就可以把问题转换成两个数的和等于target的问题了
* 即可以采用首尾指针碰撞的方式去解题了,只是需要注意的是:题意中,不允许出现重复的组合,所以需要跳过重复的元素。
*/
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> resultList = new ArrayList<List<Integer>>();
// 将数组进行排序
Arrays.sort(nums);
for (int i=0; i<nums.length; i++) {
if (i>0 && nums[i]==nums[i-1]) { // 去掉重复的元素, 如果和前面的比,相等就直接后移
continue;
}
int m = i+1;
int n = nums.length-1;
while (m < n) {
if (nums[i]+nums[n]+nums[m] == 0) {
resultList.add(Arrays.asList(nums[i], nums[m], nums[n]));
m++;
n--;
// 去掉重复的元素
while (m<n && nums[m]==nums[m-1]) { // 如果和前面的相等,则直接后移
m++;
}
while (m<n && nums[n]==nums[n+1]) { // 如果和后面的相等,则直接前移
n--;
}
} else if (nums[i]+nums[n]+nums[m] < 0) {
m++;
} else {
n--;
}
}
}
return resultList;
}
}