给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> mlists=new ArrayList<List<Integer>>();
Arrays.sort(nums); //排序
for(int k=0;k<nums.length;k++){
int i=k+1; //左指针
int j=nums.length-1; //右指针
while(i<j){
int target=nums[i]+nums[j]; //左右两数之和
if(nums[k]>(0-target)){ //即遍历的数大于差值 即右边的数大了 右指针向左移动
j--;
}else {
if(nums[k]<(0-target)) { //即遍历的数小于差值 即左边的数大了 左指针向右移动
i++;
} else {
if(nums[k]==(0-target)){ //找到符合要求的三个数
List<Integer> list=new ArrayList<>();
list.add(nums[k]);
list.add(nums[i]);
list.add(nums[j]);
mlists.add(list);
//防止集合重复 将相隔为一的相同数过滤掉
while(i<j&&nums[i]==nums[i+1]){
i++;
}
while(i<j&&nums[j]==nums[j-1]){
j--;
}
i++;
j--;
}
}
}
}
//防止集合重复 将靠着的相同数过滤掉
while(i<j&&nums[i]==nums[i+1]){
while(k<nums.length-1&&nums[k]==nums[k+1]){
k++;
}
}
return mlists;
}
}