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]
]
代码解析:此题和之前的2sum很相似,不同的就是它可以有多个结果用list表示,去掉重复是重要的步骤
public class Solution2 {
public static void main(String[] args) {
int [] nums = {-1, 0 ,1, 2 ,-1 ,-4};
System.out.println(threeSum(nums));
// TODO Auto-generated method stub
}
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> sumList = new ArrayList<List<Integer>>();
if(nums.length < 3)
return sumList;
Arrays.sort(nums);
for(int i=0; i<nums.length-2; i++) {
//去重nums[i] > nums[i - 1]
if (i == 0 || nums[i] > nums[i - 1]) {
int start = i+1;
int end = nums.length-1;
while(start<end) {
if(nums[i]+nums[start]+nums[end] == 0) {
ArrayList<Integer> tempList = new ArrayList<Integer>();
tempList.add(nums[i]);
tempList.add(nums[start]);
tempList.add(nums[end]);
sumList.add(tempList);
start++;
end--;
//去掉重复的数据
while((start<end) && (nums[end]==nums[end+1]))
end--;
while((start<end) && (nums[start]==nums[start-1]))
start++;
} else if(nums[i]+nums[start]+nums[end] > 0) {
end--;
} else {
start++;
}
}
}
}
return sumList;
}
}