思路如下:
遍历一遍数组
其中过程设立左右两个指针进行判断遍历
我们设置 left为做指针 right为右指针
因为已经有序了 当nums[i]为正数的时候就不可能 在以后的数字中找到和为0
nums[i]+nums[left]+nums[right] =0 添加结果 <0说明左边太小 left++ >0说明右边太大 right–
注意为零后我们仍然不能就此退出当前,有可能下面还有使结果为零的组合
所以任然要继续left和right指针移动 但是当有重复的要掠过
因为
if(i>0 && nums[i]==nums[i-1]) continue;
判断nums[i]是否重复 开头是否重复
while(left < right && nums[left+1] == nums[left]) ++left;
while (left < right && nums[right-1] == nums[right]) --right;
判断中间和右边是否重复
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> listAll = new ArrayList<List<Integer>>();
Arrays.sort(nums);
/*
思路如下:
遍历一遍数组
其中过程设立左右两个指针进行判断遍历
我们设置 left为做指针 right为右指针
因为已经有序了 当nums[i]为正数的时候就不可能 在以后的数字中找到和为0
nums[i]+nums[left]+nums[right] =0 添加结果 <0说明左边太小 left++ >0说明右边太大 right--
*/
if(nums.length<3) return listAll;
int len = nums.length;
for( int i = 0; i < len ; i++){
if(nums[i] > 0) break;
int left = i+1;
int right =len-1;
if(i>0 && nums[i]==nums[i-1]) continue;
while(left < right){
int sum = nums[i]+nums[left]+nums[right];
if(sum == 0){
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[left]);
list.add(nums[right]);
listAll.add(list);
//接下来要判断下一个 元素是不是和当前元素相等,如果相等掠过
while(left < right && nums[left+1] == nums[left]) ++left;
while (left < right && nums[right-1] == nums[right]) --right;
//执行完要向前签进 之前就忘了这个 为零时的后面要++
++left;
--right;
}
if(sum < 0 )
left++;
if(sum>0)
right--;
}
}
return listAll;
}
}