给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路:主要体现双指针的用法这一用法很常见,主要体现在搜索查找满足某个条件下。而本题主要体现是先订一个数,在双指针移动后面两个看是否满足条件,并且还要考虑去重,主要也是去重重复的数值,重复的值。而我自己想的主要是没解决重复问题。
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> lists=new ArrayList<>();
//先给数组进行排序
Arrays.sort(nums);
//定一个数x,用两个指针指向数组中在它后面的元素的开始和结尾,向中间遍历
for(int k=0;k<nums.length-2;k++)
{
if(!lists.isEmpty()&&nums[k]==nums[k-1]) //去重条件去掉lists存在,就可以不找下面一个了 重点
{
continue;
}
int i=k+1,j=nums.length-1;
while(i<j)
{
if(nums[i]+nums[j]+nums[k] == 0)
{
List<Integer> list=new ArrayList<>();
list.add(nums[k]);
list.add(nums[i]);
list.add(nums[j]);
lists.add(list);
i++;
j--;
//判断在去重
while(nums[i]==nums[i-1]&&i<j)
{
i++;
}
while(nums[j]==nums[j+1]&&i<j)
{
j--;
}
}
//判断值小往右移
else if(nums[i]+nums[j]+nums[k]<0&&i<j)
{
i++;
continue;
}
else
{
j--;
continue;
}
}
}
return lists;
}