本题难点在于去重,题中要求返回所有和为0且不重复的三元组
解题思路:排序+双指针+去重
首先对原始数组进行排序,对排序完的数据进行处理,首先先遍历第一个数,将三数之和转换为两数之和来求解,其中要注意三元组中的每个元素去重,在遍历第一个数的时候,就对第一个数去重,遍历第二个数的时候,也对第二个数进行去重操作。
代码实现如下:
public List<List<Integer>> threeSum(int[] nums) {
int n=nums.length;
List<List<Integer>> res=new ArrayList<>();//用于封装最终结果
Arrays.sort(nums);
for(int i=0;i<n;i++)//遍历第一个数
{
//对第一个数去重
if(i>0 && nums[i]==nums[i-1])
{
continue;
}
int third=n-1;//获取第三个数启始索引
int target=-nums[i];//获取第二个数和第三个数相加的目标值
for(int second=i+1;second<n;second++)
{
//对第二个数去重
if(second>i+1 && nums[second]==nums[second-1])
{
continue;
}
while(second<third && nums[third]+nums[second]>target)
{
third--;
}
//如果左右指针指向索引相同,则结束循环
if(second==third)
{
break;
}
if(nums[second] + nums[third] == target) {
List<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[second]);
list.add(nums[third]);
res.add(list);
}
}
}
return res;
}
注意:如果使用nums[second]==nums[second+1]作为去重条件,可能导致符合条件的三元组被pass掉(因为有的三元组内元素相同)。