给出一个有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)
注意事项
在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组。
样例
如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:
(-1, 0, 1)
(-1, -1, 2)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
/**
*
* 给出一个有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)
* @author Dell
*
*/
public class Test57 {
public static ArrayList<ArrayList<Integer>> threeSum(int[] numbers)
{
ArrayList<ArrayList<Integer>> result=new ArrayList<>();
ArrayList<Integer> list=new ArrayList<>();
Arrays.sort(numbers);
for(int i=0;i<numbers.length-2;i++)
{
if(i>0&&numbers[i-1]==numbers[i]) //第一次去重
continue;
int target=0-numbers[i];
int m=i+1;
int n=numbers.length-1;
while(m<n)
{
if(numbers[m]+numbers[n]>target)
{
n--;
}
else if(numbers[m]+numbers[n]<target)
{
m++;
}
else
{
list.add(numbers[i]);
list.add(numbers[m]);
list.add(numbers[n]);
result.add(list);
list=new ArrayList<>();
//第二次去重
int k=m+1;
while(k<n&&numbers[k]==numbers[m]) k++;
m=k;
k=n-1;
while(k>m&&numbers[k]==numbers[n]) k--;
n=k;
}
}
}
return result;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++)
{
a[i]=sc.nextInt();
}
ArrayList<ArrayList<Integer>> list=null;
list=threeSum(a);
System.out.println(list);
}
}