代码:
package leetcode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class P15_dis {
public static void main(String[] args) {
//int[] nums = {-1, 0 ,0,1,1, 2, -1, -4};
int[] nums={0,0,0};
System.out.println(threeSum(nums));
}
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
if(nums.length<3)
return result;
if(nums[0]==0 &&nums[1]==0 && nums[2]==0){
result.add(Arrays.asList(0,0,0));
return result;
}
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++){
if(i==0 || (i>0 && nums[i]!=nums[i-1]) ){ //去掉可能重复的值,因为排序后,相等的值必在一起,而他们会导致重复
int j=i+1,k=nums.length-1;
while(j<k){
int sum=nums[i]+nums[j]+nums[k];
if(sum<0){
//while(j<k&&nums[j+1]==nums[j]) //跳过重复值
// j++;
j++;
}
else if(sum>0){
//while(j<k&&nums[k-1]==nums[k])
// k--;
k--;
}
else{
List<Integer> each=new ArrayList<Integer>();
/*boolean flag=true;
Iterator<List<Integer>> iterator=result.iterator();
while(iterator.hasNext()){
List<Integer> iter=iterator.next();
//if(iterator.next().get(0)==nums[i] && iterator.next().get(1)==nums[j] &&iterator.next().get(2)==nums[k]){
if(iter.get(0)==nums[i] && iter.get(1)==nums[j] &&iter.get(2)==nums[k]){
flag=!flag;
break;
}
}
if(flag){*/
each.add(nums[i]);each.add(nums[j]);each.add(nums[k]);
result.add(each);
// }
while(j<k&&nums[j+1]==nums[j]){ //排除J++时j的下一个值等于刚刚的,而待会k前面的nums值等于刚刚的,这样会重复的
j++;
}
j++; //i固定,j固定,k如果找到一个使得sum=0,那么没有必要再继续循环了,因为即使做,要么是nums[k]更小不会再等于0要么是nums[k-1]=nums[k]那更是重复不需要了 所以j可以进行下一轮了
while(j<k&&nums[k-1]==nums[k]){ //其实有了j的循环后这个可以不要,因为如果存在k前面的值等于刚刚的,j进行下一个后必然不可能使得sum=0,但是也可以对称写了
k--;
}
k--; //因为排过序,所以j++,nums[j]必然更大,所以只有K--,才有可能使得sum=0
//这样就排除了k循环时导致的重复问题了;而
}
}
}
}
return result;
}
}