
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>>a=new ArrayList<>();
Arrays.sort(nums);//排序,等下可以操作
for(int i=0;i<nums.length;i++)
{
if(nums[i]>0)
{
return a;//如果最左边的数都大于0了,就没必要再往下进行了,因为后面的排序后都大于0
}
if(i>0&&nums[i]==nums[i-1])
{
continue;//这时候直接往右移就行了,进行下一步。
}
int left=i+1;
int right=nums.length-1;
while(right>left)
{
int sum=nums[i]+nums[left]+nums[right];
if(sum>0)//说明三数之和大了,right得往左移
{
right--;
}else if(sum<0)
{
left++;
}
else{//这时候说明sum=0了,开始操作
a.add(Arrays.asList(nums[i],nums[left],nums[right]));
//这两步不容易想到,可以做笔记,下次注意
while(right>left&&nums[right]==nums[right-1])
{
right--;
}
while(right>left&&nums[left]==nums[left+1])
{
left++;
}
//处理完上一个三元组后该为下一个三元组的处理做铺垫了
right--;
left++;
}
}
}
return a;
}
}