题目:
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
翻译:
给定一个包含n个整数的数组,在数组中是否存在a、b、c元素使得a + b + c = 0?找出数组中所有唯一的三胞胎,它们的和为零。
注意:
解决方案集不能包含重复的三元组。
例子:
给定数组编号= [-1,0,1,2,-1,-4],
解集为:
(
[1,0,1],
(1,1,2)
]
思路: 将求三数之和可以转换为求两数之和,首先对数组进行排序,然后固定一个数从头开始遍历,其它两个数一个为固定数的下一位,一个为数组最后一位, 当三数之和大于0说明右边的数较大,小于0说明左边的数较小; 需要注意的是,要去除重复数字;
代码实现:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
if(nums.length < 3 || nums[0]>0 || nums[nums.length-1] < 0 )
return list;
for(int i =0 ;i<nums.length-2 ;i++){
if(i>0&&nums[i-1]==nums[i]) //必须要略过0, {-1,-1,2} 否则这种类型的会遗忘
continue;
int n= 0-nums[i];
int l=i+1;
int r=nums.length-1;
while(l<r){
if(n<nums[l]+nums[r]){
r--;
}else if(n>nums[l]+nums[r]){
l++;
}else{
list.add(Arrays.asList(nums[i],nums[l],nums[r]));
//可变参数列表转换成集合
l++;
r--;
while(l<r&&nums[l]==nums[l-1]) //跳过相同的元素
l++;
while(l<r&&nums[r]==nums[r+1])
r--;
}
}
}
return list;
}
}