每日算法(二十)-java给定一个数组,求是否存在数组里的四个元素相加等于目标数
结果可能不止一个,每个可能里面又包含了四个元素,所以这里用链表来存
最先确定第一个数和第二个数,就是普通循环确定,然后根据先两个数找出来了,再利用二分查找去找后两个数,代码如下
public static List<List<Integer>> fourSum(int arr[],int target){
List<List<Integer>> list=new ArrayList<>();
if(arr.length<4||arr==null){
return list;
}
Arrays.sort(arr);
for(int i=0;i<arr.length-3;i++) { //取第一个数
if(i>0&&arr[i-1]==arr[i])
continue;
for(int j=i+1;j<arr.length-2;j++){ //取第二个数
if(j!=i+1 && arr[j]==arr[j-1])
continue;
int start=j+1; //取第三个第四个数
int end=arr.length-1;
while(start<end){
int sum=arr[i]+arr[j]+arr[start]+arr[end];
if(sum==target){
List<Integer> li=new ArrayList<>();
li.add(arr[i]);
li.add(arr[j]);
li.add(arr[start]);
li.add(arr[end]);
list.add(li);
while(start<end &&arr[start+1]==arr[end])
start++;
while(start<end&&arr[end-1]==arr[end])
end--;
start++;
end--;
}else if(sum<target)
start++;
else
end--;
}
}
}
return list;
}