两数之和的升级版,核心思想是一致的。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
//不足三个数字的直接返回空集合
if(nums == null || nums.length < 3) return res;
//先排序,再利用双指针分别从数组两端遍历
Arrays.sort(nums);
//for循环指定第一个数字
for(int i=0; i<nums.length-2;i++){
//第一个数大于0时,不可能存在三数之和为0
if(nums[i]>0)break;
//分别指定左右指针,
int l = i+1;
int r = nums.length-1;
//第一个数字去重
if(i>0 && nums[i] == nums[i-1])continue;
while(l<r){
int sum = nums[i] + nums[l] + nums[r] ;
if(sum == 0){
res.add(Arrays.asList(nums[i],nums[l],nums[r]));
//左右指针的去重,这里要在if判断内
while(l<r && nums[l]==nums[l+1]){l++;}
while(l<r && nums[r]==nums[r-1]){r--;}
l++;
r--;
}
//利用数组有序的性质,对sum的正负进行判断并调整左右指针
else if(sum<0)l++;
else if(sum>0)r--;
}
}
return res;
}
}