主要是对双指针的运用。
1.把数组进行排序,这样两个相同的数就会排在一起,方便去重。
2.外层循环确定第一个数,里面两个指针确定另外两个数。
public class ThreeSumDemo {
public static List<List<Integer>> threeSum(int[] nums){
List<List<Integer>> lists = new ArrayList<>();
int len = nums.length;
//如果数组为空或者数组长度小于3,三数之和不可能为0
if(nums==null||len<3){
return lists;
}
//排序
Arrays.sort(nums);
for(int i=0;i<len;i++){
//排序后,如果第一个数大于0,三数之和不可能为0
if (nums[i]>0){
break;
}
//去重
if(i>0&&nums[i]==nums[i-1]){
continue;
}
//定义两个指针
int L=i+1;
int R=len-1;
while (L<R){
int sum=nums[i]+nums[L]+nums[R];
//三数之和等于0
if(sum==0){
ArrayList<Integer> integers = new ArrayList<>();
integers.add(nums[i]);
integers.add(nums[L]);
integers.add(nums[R]);
lists.add(integers);
//去重
while(L<R&&nums[L]==nums[L+1]){
L++;
}
while (L<R&&nums[R]==nums[R-1]){
R--;
}
//移动指针
L++;
R--;
}else if(sum<0){
L++;
}else if(sum>0){
R--;
}
}
}
return lists;
}