题目
-
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
-
注意:答案中不可以包含重复的三元组。
解答
private static List<List<Integer>> findThreeNumber(int[] arr) {
List<List<Integer>> result = new ArrayList<>();
int length = arr.length;
if (arr == null || length < 3) return result;
// 数组排序
Arrays.sort(arr);
// 遍历查找
for (int i = 0; i < length; i++) {
// 第一个数就大于0,不可能存在三数等于0情况
if (arr[i] > 0) break;
// 去重
if (i > 0 && arr[i] == arr[i - 1]) continue;
// 定义左、右指针
int left = i + 1;
int right = length - 1;
// 移动指针进行匹配
while (left < right) {
int sum = arr[i] + arr[left] + arr[right];
// 将符合条件的添加到result中
if (sum == 0) {
result.add(Arrays.asList(arr[i], arr[left], arr[right]));
// 去重
while (left < right && arr[left] == arr[left + 1]) left++;
while (left < right && arr[right] == arr[right - 1]) right--;
left++;
right--;
} else if (sum > 0) {
right--;
} else left++;
}
}
return result;
}
测试
private static void threeNumberSum() {
int[] arr = {1, 2, 3, -1, -2, 4, 0};
System.out.println(findThreeNumber(arr));
结果输出
[[-2, -1, 3], [-2, 0, 2], [-1, 0, 1]]