给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
其实和题目16类似稍做修改即可,时间复杂度O(n^2)
主要变动为
不可重复要处理,
相近改为相同要处理
class Solution {
public List<List<Integer>> threeSum(int[] nums)
{
Arrays.sort(nums);//java自带快排
List<List<Integer>> result = new LinkedList<>();
int target=0;
int sum;
for(int i=0;i<=nums.length-3;i++)//减3因为最后三个数
{
if(i==0||(i>0&&nums[i]!=nums[i-1]))//我用这个麻烦的方法是因为我暂时不知道如何和list里面的数组是否equal,只能在进去分析前把相同的数剃掉
{
int start=i+1;//第二个数的指针从i后一位开始
int end=nums.length-1;//第三个数的指针从最后一位开始
while(start<end)
{
if(start==i+1||(start>i+1&&nums[start]!=nums[start-1]))
{
if(end==nums.length-1||(end<nums.length-1&&nums[end]!=nums[end+1]))
{
sum=nums[i]+nums[start]+nums[end];
//如果sum比target小,那么让sum大一点,即start加1
if(sum<target)
{
start=start+1;
}
//如果sum比target小,那么让sum大一点,即start加1
else if(sum>target)
{
end=end-1;
}
//一样可以直接输出,因为题目假定唯一最近
else
{
result.add(new LinkedList<>(Arrays.asList(nums[i],nums[start],nums[end])));
start+=1;
}
}
else {end=end-1;}
}
else {start=start+1;}
}
}
}
return result;
}
}