先分享第一反应想到的解法,因为只要求四个元素相加和为一目标值,可以先定下一个值,将问题简化为求三个数和为固定值,然后再固定一个值,转为两个数和为固定值,以此来找到定值为K的四个元素的所有组合。
有一个需要注意的点,避免重复,给定的数组中可能会有相同值的数,为了避免最后得到重复的组合,我们要先将数组排序,这样遇到重复的跳过即可。
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class fixedSum{
private static int NUM_AMOUNT=4;
private static List>fixedSum(int[]nums,int target){
List>res=new ArrayList<>();
//如果数组长度不足4,返回空结果
if(nums==null||nums.length0&&nums[i]==nums[i-1]) {
continue;
}
//对于连续的四个数相加如果大于TARGET,则之后不可能再出现四元组,跳出循环
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target) {
break;
}
//如果当前值加上最大的三个数都小于target,那就跳出此轮循环
if(nums[i]+nums[len-3]+nums[len-2]+nums[len-1]i+1 &&nums[j]==nums[j-1]) {
continue;
}
//连续的三个数相加如果大于target,跳出循环
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target) {
break;
}
//加上最大的两个数如果小于target,跳出此轮循环
if(nums[i]+nums[j]+nums[len-2]+nums[len-1]0)
for(int i=0;i>res=fixedSum(nums,target);
print(res);
}
}
private static void print(List>res) {
for(ListsubArr:res) {
for(Integer element:subArr) {
System.out.print(element+" ");
}
System.out.print("$");
}
System.out.println();
}
}



