57. 三数之和
给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
样例
例1:
输入:[2,7,11,15]
输出:[]
例2:
输入:[-1,0,1,2,-1,-4]
输出:[[-1, 0, 1],[-1, -1, 2]]
注意事项
在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组。
public class Solution {
/**
* @param numbers: Give an array numbers of n integer
* @return: Find all unique triplets in the array which gives the sum of zero.
*/
public List<List<Integer>> threeSum(int[] numbers) {
//希尔排序(插入排序变种版)
for (int i = numbers.length / 2; i > 0; i /= 2) {
//i层循环控制步长
for (int j = i; j < numbers.length; j++) {
//j控制无序端的起始位置
for (int k = j; k > 0 && k - i >= 0; k -= i) {
if (numbers[k] < numbers[k - i]) {
int temp = numbers[k - i];
numbers[k - i] = numbers[k];
numbers[k] = temp;
} else {
break;
}
}
}
//j,k为插入排序,不过步长为i
}
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < numbers.length - 2; i++) {
for (int j = i + 1; j < numbers.length - 1; j++) {
int sum2=numbers[i]+numbers[j];
for (int k = j + 1; k < numbers.length ; k++) {
int sum=sum2+numbers[k];
if (sum==0){
List<Integer> list=new ArrayList<>();
list.add(numbers[i]);
list.add(numbers[j]);
list.add(numbers[k]);
if (!result.contains(list))result.add(list);
}else if (sum>0){
break;
}
}
}
}
return result;
}
}