https://leetcode-cn.com/problems/3sum/solution/san-shu-zhi-he-by-leetcode-solution/
class Solution {
public static List<List<Integer>> threeSum(int[] nums) {
// int [] nums={
-4,0,1,2,-1,-1,-4};
List list = new ArrayList();
boolean flagg=true;
int len=nums.length;
if(len<3) //[][0][0,0]的结果都是[]
return list;
//处理[0,0,0,0....]的情况
for (int i=0;i<len;i++){
if( nums[i]!=0){
flagg=false;
break;
}
}
if (flagg==true){
List<Integer> listsmall=new ArrayList<Integer>();
listsmall.add(0);
listsmall.add(0);
listsmall.add(0);
list.add(listsmall);
return list;
}
// for (int i=0;i<len-1;i++){
// boolean flag=true;
// for(int j=0;j<len-1-i;j++){
// if(nums[j]>nums[j+1]){
// int temp=nums[j];
// nums[j]=nums[j+1];
// nums[j+1]=temp;
// flag=false;
// }
// }
// if (flag==true)
// break;
// }
//给nums排序
Arrays.sort(nums);
// for(int i=0;i<len;i++){
// System.out.println(nums[i]);
// }
for (int i=0;i<len; i++){
// 需要和上一次枚举的数不相同
if(i>0&&nums[i]==nums[i-1])
continue;
int sum=0-nums[i];
int begin=i+1;
int end=len-1;
while(begin<end){
int rsum=nums[begin]+nums[end];
if(rsum>sum)
end--;
if (rsum < sum)
begin++;
if (rsum == sum){
List<Integer> listsmall = new ArrayList<Integer>();
listsmall.add(nums[i]);
listsmall.add(nums[begin]);
listsmall.add(nums[end]);
list.add(listsmall);
//可能存在多解,跳过相同字符
//多解 不存在相同字符:-1 -1 0 1 2 固定第0个-1(-1,-1,2)(-1,0,1)
//多解 存在相同字符:-1 -1 -1 0 1 2 固定第0个-1(-1,-1,2)(-1,-1(第二个),2),这里的第二个-1就需要跳过,不然会有重复解
while(begin<end&&nums[begin+1]==nums[begin]){
begin++;
}
begin++;
while(begin<end&&nums[end-1]==nums[end]){
end--;
}
end--;
}
}
}
return list;
}
}