给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。
注意事项
四元组(a, b, c, d)中,需要满足a <= b <= c <= d
答案中不可以包含重复的四元组。
样例
例如,对于给定的整数数组S=[1, 0, -1, 0, -2, 2] 和 target=0. 满足要求的四元组集合为:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
注意事项
四元组(a, b, c, d)中,需要满足a <= b <= c <= d
答案中不可以包含重复的四元组。
样例
例如,对于给定的整数数组S=[1, 0, -1, 0, -2, 2] 和 target=0. 满足要求的四元组集合为:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
(-2, 0, 0, 2)
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
/**
* 给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。
注意事项
四元组(a, b, c, d)中,需要满足a <= b <= c <= d
答案中不可以包含重复的四元组。
样例
例如,对于给定的整数数组S=[1, 0, -1, 0, -2, 2] 和 target=0. 满足要求的四元组集合为:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
(-2, 0, 0, 2)
*
* @author Dell
*
*/
public class Test58 {
public static ArrayList<ArrayList<Integer>> fourSum(int[] numbers, int target)
{
ArrayList<ArrayList<Integer>> result=new ArrayList<>();
ArrayList<Integer> list=new ArrayList<>();
Arrays.sort(numbers);
for(int i=0;i<numbers.length-3;i++)
{
if(i>0&&numbers[i-1]==numbers[i])
continue;
for(int j=i+1;j<numbers.length-2;j++)
{
if(j>i+1&&numbers[j-1]==numbers[j])
continue;
int newtarget=target-numbers[i]-numbers[j];
int m=j+1;
int n=numbers.length-1;
while(m<n)
{
if(numbers[m]+numbers[n]>newtarget)
{
n--;
}
else if(numbers[m]+numbers[n]<newtarget)
{
m++;
}
else
{
list.add(numbers[i]);
list.add(numbers[j]);
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<a.length;i++)
{
a[i]=sc.nextInt();
}
int target=sc.nextInt();
ArrayList<ArrayList<Integer>> result=null;
result=fourSum(a,target);
System.out.println(result);
}
}