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:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- 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)
做过了2 Sum,这题自然不在话下。顺序遍历一遍数组,对于每个元素num[i],用-num[i]作为目标值对剩下的元素来做2 sum即可。注意数组排序以后,对于每一个i,只需要对i后面的数组元素进行2 sum即可。
另外这里比较trick的地方就是要注意去除重复元素。
public class Solution {
public List<List<Integer>> threeSum(int[] num) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (num.length <= 2)
return res;
Arrays.sort(num);
int iValue = num[0];
int jValue, kValue;
List<Integer> sol = new ArrayList<Integer>(3);
//initialize the arraylist with three meaningless values
for(int i = 0; i < 3; i++){
sol.add(Integer.MIN_VALUE);
}
for (int i = 0; i < num.length - 2; i++) {
// avoid duplication
if (i != 0 && num[i] == iValue)
continue;
sol.set(0, num[i]);
// do two sum
int j = i + 1;
int k = num.length - 1;
while (j < k) {
jValue = num[j];
kValue = num[k];
int twoSum = num[j] + num[k];
// found a solution
if (twoSum + sol.get(0) == 0) {
sol.set(1, num[j]);
sol.set(2, num[k]);
res.add(new ArrayList<Integer>(sol));
// increment j until num[j] is different from the current j
// value to avoid duplicates
while (++j < k && num[j] == jValue)
;
// the same for k
while (--k > j && num[k] == kValue)
;
} else {
if (twoSum + sol.get(0) < 0) {
while (++j < k && num[j] == jValue)
;
} else {
while (--k > j && num[k] == kValue)
;
}
}
}
iValue = num[i];
}
return res;
}
}