题目:三数之和
给你一个包含 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) {
//按照升序排序
Arrays.sort(nums);
int len = nums.length;
List<List<Integer>> ans = new ArrayList();
//寻找满足num[i]+num[j]+num[k]=0的值
//i从0开始
for (int i=0;i<len-2;i++){
//如果num[i]重复,则跳过当前num[i]指向下一个
if (i>0 && nums[i] == nums[i-1]){
continue;
}
//k从最后一个开始,倒叙取值
//nums[j] + nums[k] + nums[i]=0后,i不变,因为是升序,num[j]变大,num[k]则变小,所以j增加,则k减小;
int k=len-1;
//j从i的下一个开始
for (int j=i+1;j<len-1 && k>j;j++){
//如果num[j]重复,则跳过当前num[j]指向下一个
if (j>i+1 && nums[j] == nums[j-1]){
continue;
}
//当nums[j] + nums[k] + nums[i]>0时,不断减少k值,直到nums[j] + nums[k] + nums[i]<=0
while (j < k && nums[j] + nums[k] + nums[i]>0 && k-1>j ) {
--k;
}
//如果满足条件则添加到答案中
if (nums[i]+nums[j]+nums[k]==0){
List<Integer> add = new ArrayList();
add.add(nums[i]);
add.add(nums[j]);
add.add(nums[k]);
ans.add(add);
}
}
}
return ans;
}
}