题目:Three Sum
思路:思路就是遍历一遍数组作为第一个元素,后面两个元素采用two-sum的方法,target为给的值n-num[i]。two-sum利用夹逼,左指针为i+1,右指针为数组end,直到找到符合的组合。找到后仍要继续找(指针继续往里)。
误区:1. 需要去掉重复的元素,因为重复的元素找的组合是一样的。保证list的元素的唯一性。代码中体现在一个是第一个元素的遍历,一个是在遍历后两个元素的时候。
2. 每次都要新建一个list加入结果。
复杂度: 时间:O(n^2); 空间: O(n)
代码:
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if (num==null || num.length<3)
return res;
Arrays.sort(num);
for (int i=0;i<num.length-2;i++){
if (i>0&&num[i]==num[i-1])
continue;
int target = -num[i];
int l = i+1;
int r = num.length-1;
while(l<r){
if (num[l]+num[r]==target){
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(num[i]);
list.add(num[l]);
list.add(num[r]);
res.add(list);
l++;
r--;
while(l<r&&num[l]==num[l-1]){
l++;
}
while(l<r&&num[r]==num[r+1]){
r--;
}
}
else if (num[l]+num[r]>target){
r--;
}
else{
l++;
}
}
}
return res;
}