给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
public class three_sum_15 {
/**
* 双指针法: 先对数组进行排序,固定一个k指针在有序数组中依次向后遍历,
* i,j指针分别为剩余部分的头和尾以此向中间收缩,寻找三数和为零的结果集。
* 收缩原则: ①k指向元素大于零时,直接返回,因为k指向的元素为最小值,三数之和必然无法等于零。
* ②去重处理,array[k,i] == array[k,i - 1]说明当前元素和上一个处理元素值相同,
* 则直接跳过k++,i++。j值同理跳过j--
* ③当array[i] + array[j] + array[k] == 0加入结果集
*/
public List<List<Integer>> threeSum(int[] array) {
List<List<Integer>> list = new ArrayList<>();
if (array.length < 3) {
return list;
}
Arrays.sort(array);
for (int k = 0; k < array.length; k++) {
if (array[k] > 0) {
break;
} else if (k > 0 && array[k] == array[k - 1]) {
continue;
} else {
int i = k + 1;
int j = array.length - 1;
while (i < j) {
if (array[i] + array[j] < -array[k]) {
i++;
} else if (array[i] + array[j] > -array[k]) {
j--;
} else if (array[i] + array[j] == -array[k]) {
list.add(Arrays.asList(array[k], array[i], array[j]));
i++;
j--;
}
}
}
}
return list;
}
/**
* 暴力解题:设置三重循环依次遍历寻找三数之和为0
*/
public List<List<Integer>> threeSum1(int[] array) {
List<List<Integer>> list = new ArrayList<>();
for (int k = 0; k < array.length - 2; k++) {
for (int i = k + 1; i < array.length - 1; i++) {
for (int j = i + 1; j < array.length; j++) {
if (array[k] + array[i] + array[j] == 0) {
list.add(Arrays.asList(array[k], array[i], array[j]));
}
}
}
}
//iter给最终结果进行去重
List<List<Integer>> li = new ArrayList<>();
for (List<Integer> element : list) {
if (!(li.contains(element))){
li.add(element);
}
}
return li;
}
public static void main(String[] args) {
int[] arr = {-1, 0, 1, 2, -1, -3, -2};
List<List<Integer>> li = new ArrayList<>();
li = new three_sum_15().threeSum(arr);
System.out.println(li);
List<List<Integer>> list = new ArrayList<>();
list = new three_sum_15().threeSum1(arr);
System.out.println(list);
}
}