方法:双指针法
思路:给数组排序,当sum大于0,说明大了,right指针向左移动;小于0,说明小了,left指针向右移动;当等于0,存入并且判断重复来移动指针(去重操作)。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> resul=new ArrayList<List<Integer>>();
Arrays.sort(nums);
for(int i=0;i<nums.length;i++)
{
//剪枝
if(nums[i]>0)
return resul;
//去重
if(i>0&&nums[i]==nums[i-1])
continue;
//初始化
int left=i+1;
int right=nums.length-1;
//循环
while(left<right)
{
int sum=nums[i]+nums[left]+nums[right];
//大了
if(sum>0)
{
right--;
}
//小了
else if(sum<0)
{
left++;
}
//相等
else
{
//以集合形式存入
resul.add(Arrays.asList(nums[i],nums[left],nums[right]));
//right遍历到与下一个元素没有重复的位置
while(left<right&&nums[right]==nums[right-1])
right--;
//left遍历到与下一个元素没有重复的位置
while(left<right&&nums[left]==nums[left+1])
left++;
//移动left,right
left++;
right--;
}
}
}
return resul;
}
}