首先对数组进行排序,取出第一个数作为结点,
然后使用双指针 left 和right 进行遍历,如果存在三数之和等于零,则对left 和right进行查重,遍历完后,对a进行查重
时间复杂度为O(n^2)
空间复杂度O(n)
arrays.sort排序
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list=new ArrayList<>();
if(nums.length==0)return list;
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
int left=i+1;
int right=nums.length-1;
int a=nums[i];
if(a>0)break;
while(left<right){
if(nums[left]+nums[right]<-a){
left++;
}else if(nums[left]+nums[right]>-a){
right--;
}else{
list.add(
new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right])));
int b=nums[left];
left++;
while(left<right&&b==nums[left])left++;
int c=nums[right];
right--;
while(left<right&&c==nums[right])right--;
}
}
while(i+1<nums.length&&a==nums[i+1])i++;
}
return list;
}
}