描述
给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
注意事项
在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组。
样例
如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:
(-1, 0, 1)
(-1, -1, 2)
代码
思路:该题如果不使用暴力破解的话,可以先对原数组进行排序,然后设定三个用于迭代的变量k,i,j。使用k来固定这三个数中的第一个数,然后i从k的后一个开始,j从最后一个开始遍历,随后计算这三个值的和,等于的情况就不讨论了,如果大于target的话,我们让j向左移动,表示,需要替换一个更小的值;如果小于target的话,我们让i向右移动,表示需要替换一个更大的值。
public class Solution {
/*
* @param numbers: Give an array numbers of n integer
* @return: Find all unique triplets in the array which gives the sum of zero.
*/
public List<List<Integer>> threeSum(int[] numbers) {
// write your code here
Arrays.sort(numbers);
List<List<Integer>> result=new LinkedList<>();
if(numbers[0]>0||numbers[numbers.length-1]<0){
return result;
}
int target=0,k,length=numbers.length,i,j;
for(k=0;k<length;k++){
if(k>0&&numbers[k]==numbers[k-1]){
continue;
}
for(i=k+1,j=length-1;i<j;){
if(i>k+1&&numbers[i]==numbers[i-1]){
i++;
continue;
}
if(j<length-1&&numbers[j]==numbers[j+1]){
j--;
continue;
}
int temp=numbers[k]+numbers[i]+numbers[j];
if(temp==target){
List<Integer> list=new LinkedList<>();
list.add(numbers[k]);
list.add(numbers[i]);
list.add(numbers[j]);
result.add(list);
i++;j--;
}else if(temp>target){
j--;
}else{
i++;
}
}
}
return result;
}
}
寻找零和三元组
本文介绍了一种高效算法,用于在整数数组中找出所有唯一三元组,这些三元组的和为零。通过排序和双指针技巧避免重复结果。
1249

被折叠的 条评论
为什么被折叠?



