package com.company;
import java.util.*;
public class Main {
public static void main(String[] args) {
int[] nums = {-1,0,1,2,-1,-4};
List<List<Integer>> result = threeSum(nums);
}
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);//先排序
if (nums == null || nums.length < 3) {
return result;
}
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
return result;
}
if (i > 0 && nums[i] == nums[i - 1]) {//对i满足要求的组合进行去重
continue;
}
int left = i + 1;
int right = nums.length - 1;
while (right > left) {
int sum = nums[i] + nums[left] + nums[right];
if (sum > 0) {
right--;
} else if (sum < 0) {
left++;
} else {
List<Integer> smalllist = new ArrayList<>();
smalllist.add(nums[i]);
smalllist.add(nums[left]);
smalllist.add(nums[right]);
result.add(smalllist);
while (right > left && nums[right] == nums[right - 1]) {//这里不能用if,只能用while,因为连续相同的数可能很多个
right --;//去重:因为前一个right已经完成过组合了,所以当前right如果和前一个一样,就不查找了。
}
while (right > left && nums[left] == nums[left +1]) {
left ++;//去重:因为前一个left已经完成组合了,所以当前left如果和前一个一样,就不查找了。
}
right--;//向左移动一位
left++;//向右移动一位
}
}
}
return result;
}
}