先对数组排序,然后固定一个数字,再求两个数字之和。
public ArrayList<arraylist<integer>> threeSum(int[] num) {
//先排序
Arrays.sort(num);
ArrayList<arraylist<integer>> res = new ArrayList<>();
int length = num.length;
for (int i = 0; i < length - 2; i++) {
//过滤掉重复的
if (i != 0 && num[i] == num[i - 1])
continue;
int left = i + 1;
int right = length - 1;
int target = -num[i];
//改为求两数之和
while (left < right) {
int midVale = num[left] + num[right];
if (midVale == target) {
res.add(new ArrayList<>(Arrays.asList(num[i], num[left], num[right])));
while (left < right && num[left] == num[left + 1])//过滤掉重复的
left++;
while (left < right && num[right] == num[right - 1])//过滤掉重复的
right--;
left++;
right--;
} else if (midVale < target)
left++;
else
right--;
}
}
return res;
}