题目:
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
/**
* 还是采用双指针的算法寻和
* @param nums
* @param target
* @return
*/
public static List<List<Integer>> method(int[] nums,int target){
//不符合情况,直接返回空列表
if(nums==null||nums.length<4){
return new ArrayList<>();
}
//对数组进行排序
Arrays.sort(nums);
List<List<Integer>> result = new ArrayList<>();
for(int i=0;i<nums.length-3;i++){
//如果数字相同,直接轮询下一个
if(i>0&&nums[i]==nums[i-1]){
continue;
}
//如果当前数字大于目标数值,则直接结束循环
if ((long) nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
break;
}
//如果当前数字小于目标数值,则第一位应向后移动一位
if ((long) nums[i] + nums[nums.length - 3] + nums[nums.length - 2] + nums[nums.length - 1] < target) {
continue;
}
for (int j=i+1;j< nums.length;j++){
//如果数字相同,直接轮询下一个
if(j>i+1&&nums[j]==nums[j-1]){
continue;
}
//开始索引
int begin = j+1;
//结束索引
int end = nums.length-1;
while (begin<end){
int sum = nums[i]+nums[j]+nums[begin]+nums[end];
if(sum>target){
while (begin<end&&nums[end]==nums[--end]);
}else if(sum<target){
while (begin<end&&nums[begin]==nums[++begin]);
}else {
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[begin]);
list.add(nums[end]);
result.add(list);
while (begin<end&&nums[end]==nums[--end]);
while (begin<end&&nums[begin]==nums[++begin]);
}
}
}
}
return result;
}