题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路
- 一般要求结果没有重复的时候,先排序一下。
- 定义:
List<List<Integer>> res = new ArrayList<>();
- 排序:
Arrays.sort();
Arrays.asList();
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
int len = nums.length;
if(len<3) return res;
for(int i=0; i<len-2; i++){
if(nums[i] > 0) break; // 如果nums[i]为正数,那它们的和不可能为0了
if(i == 0 || (i>0 && nums[i] != nums[i-1])){ // 跳过可能重复的值
int l = i+1, r = len-1, sum = 0-nums[i];
while(l<r){
if(nums[l]+nums[r] == sum){
res.add(Arrays.asList(nums[i],nums[l],nums[r]));
while(l<r && nums[l] == nums[l+1]) l++; //跳过重复
while(l<r && nums[r] == nums[r-1]) r--; //跳过重复
l++;
r--;
}
else if(nums[l]+nums[r] < sum){
while(l<r && nums[l] == nums[l+1]) l++; //跳过重复
l++;
}
else{
while(l<r && nums[r] == nums[r-1]) r--; //跳过重复
r--;
}
}
}
}
return res;
}
}