题目描述
给定一个无序的数组,找到三个数字的和为零
public ArrayList<ArrayList<Integer>> sum_3(int[] nums){
ArrayList<List<Intger>> res=new ArrayList<>();
if(nums==null|| nums.length<=2) return res;
int n=nums.length;
int i=0;
//排序处理,确定一个值,用滑动窗口来处理
Arrays.sort(nums);
while(i<n-2){
int base=nums[i];//基础值
//左右滑动指针
int left=i+1;
int right=n-1;
while(left<right){
int sum=base+nums[left]+nums[right];
if(sum==0){
LinkedList<Integer> list= new LinkedList<Integer>();
list.add(base);
list.add(nums[left]);
list.add(nums[right]);
res.add(list);
left=moveRight(nums,left+1);
right=moveLeft(nums,right-1);
}else if(sum>0){
right=moveLeft(nums,right-1);
}else if(sum<0){
left=moveRight(nums,left+1);
}
}
i=moveRight(nums,i+1);
}return res;
}
//左右移动,清除掉重复的
public int moveLeft(int[] nums,int index){
while(index==nums.length-1 ||(index>=0 &&nums[index]==nums[index+1])){
index--;
}
}
public int moveRight(int[] nums,int index){
while(index==0 ||(index>=0 &&nums[index]==nums[index-1])){
index++;
}
return index;
}