抄了下大佬的代码,这里改用了快排。且这里想到两数之和貌似也可以使用类似二分查找来做,就做下leetcode的两数之和。但是两个数之和是并返回它们的数组下标。故而不能先排序,除非是返回值本身。故而使用查找即可。

```java
public ArrayList<arraylist<integer>> threeSum(int[] num) {
quickSort(num, 0, num.length - 1);
ArrayList<arraylist<integer>> result = new ArrayList<>();
for (int i = 0; i < num.length; i++) {
if(i !=0 && num[i] == num[i - 1])
continue;
int left = i + 1;
int right = num.length - 1;
int target = -num[i];
// 求两个数的和
while(left<right){ int mid="num[left]" + num[right]; if(mid="=" target){ arraylist<integer> temp = new ArrayList<>();
temp.add(num[i]);
temp.add(num[left]);
temp.add(num[right]);
result.add(temp);
// 去除重复元素
while(left < right && num[left] == num[left + 1]) left++;
while(left < right && num[right] == num[right - 1]) right--;
left++;
right--;
}else if(mid < target){
left++;
}else{
right--;
}
}
}
return result;
}</integer></integer></integer>

private void quickSort(int[] num, int left, int right) {
if(left < right){
int pos = partition(num, left, right);
quickSort(num, left, pos - 1);
quickSort(num, pos + 1, right);
}
}

private int partition(int[] num, int left, int right) {
int value = num[left];
while(left < right){
while(left < right && num[right] >= value) right--;
swap(num, left, right);
while(left < right && num[left] <= value) left++;
swap(num, left, right);
}
return left;
}

private void swap(int[] num, int left, int right){
int temp = num[left];
num[left] = num[right];
num[right] = temp;
}
```</right){></arraylist<integer></arraylist</integer>