针对三个数的双指针做法就是一层for循环(i=0;i<length),里面套一层while(l<r);
其中 三个数 nums[i],nums[l],nums[r];
i由for循环控制;
l由i+1控制;
r=length-1;
针对本题需要先进行排序;
解法:
特殊情况:nums==null||nums.length<3 直接return ans;
排序
循环里面
1.因为排过序,所以遇到nums[i]>0直接return ans;因为第一个数都>0,看都不用看
2.其次如果nums[i]==nums[i-1]怎么说明出现重复的第一个数,避免重复选择continue;
最后(l<r)
如果三值和为0;
则l++;r–;(为了避免下个数和上个数重复,所以用while,出现重复再加,直至没有重复)
和>0说明r大了,r–;
package LIKOU;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class l_15 {
public List<List<Integer>> threeSum(int[] nums) {
int length=nums.length;
//tips1:二维数组的定义方法
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if(length<3||nums==null)
return ans;
Arrays.sort(nums);
for(int i=0;i<length;i++) {
if(nums[i]>0)
return ans;
//tips2:为了避免重负的nums[i],这里进行判断,注意 是nums[i]==nums[i-1],不能nums[i]==nums[i+1]进行判断,具体为什么【...,-1,-1,2,...】这个例子,前者判断能进行一次【-1,-1,2】的输出,后者输出0次
if(i>0&&nums[i]==nums[i-1])
continue;
int l=i+1;
int r=length-1;
while(l<r) {
if(nums[i]+nums[l]+nums[r]==0) {
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[l]);
list.add(nums[r]);
ans.add(list);
while(l<r&&nums[l]==nums[l+1])
l++;
while(l<r&&nums[r-1]==nums[r])
r--;
l++;
r--;
}
else if(nums[i]+nums[l]+nums[r]>0)
r--;
else
l++;
}
}
return ans;
}
}