参考derrantcm的博客,网址:https://blog.csdn.net/DERRANTCM/article/details/46997233
package algorithm;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
//四个数的和
/*
原题
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note:
Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
The solution set must not contain duplicate quadruplets.
For example, given array S = {1 0 -1 0 -2 2}, and target = 0.
A solution set is:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
(-2, 0, 0, 2)
题目大意
给定一个整数数组,找出a + b + c + d = target的唯一解。
解题思路
先确定a和d的两个数,对于a和d两个数,不能同时重复使用。然后再确定b和c,同样这两个数也不能同时重复使用。找出所有满足条件的解,同时可以保证解不重复。
*/
public class FourSum {
//四个数之和
public static List<List<Integer>> fourSum(int[] num,int target){
List<List<Integer>> list=new LinkedList<List<Integer>>();
if(num==null||num.length<4){
return list;
}
Arrays.sort(num);
for(int i=0;i<num.length-3;i++){ //第一个数
if(i>0&&num[i]==num[i-1]){ //防止重复
continue;
}
for(int j=num.length-1;j>i+2;j--){ //第四个数
if(j<num.length-1&&num[j]==num[j+1]){ //第四个数防止重复
continue;
}
int start=i+1; //第二个数
int end=j-1; //第三个数
int n=target-num[i]-num[j];//剩余的和
while(start<end){
if(n==target){ //相同
List<Integer> listInner=new LinkedList<Integer>();
listInner.add(num[i]);
listInner.add(num[start]);
listInner.add(num[end]);
listInner.add(num[j]);
list.add(listInner);
do{ //start先增加一个
start++;
}while(start<end&&num[start]==num[start-1]);
do{
end--;
}while(start<end&&num[end]==num[end+1]);
}else if(n<target){ //数字较小,应较大的
do{ //start先增加一个
start++;
}while(start<end&&num[start]==num[start-1]);
}else{
do{
end--;
}while(start<end&&num[end]==num[end+1]);
}
}
}
}
return list;
}
public static void printList(List<List<Integer>> list){
if(list==null){
return;
}
for(int i=0;i<list.size();i++){
List<Integer> list2=list.get(i);
if(list2==null){
continue;
}
System.out.println("");
for(int j=0;j<list2.size();j++){
int y=list2.get(j);
System.out.print(y+",");
}
System.out.println("");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/*
For example, given array S = {1 0 -1 0 -2 2}, and target = 0.
A solution set is:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
(-2, 0, 0, 2)
*/
int[] num={1,0,-1,0,-2,2};
List<List<Integer>> list=fourSum(num,0);
printList(list);
}
}