1.给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:答案中不可以包含重复的四元组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/4sum
代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public class Demo_sishu {
public static void main(String[] args) {
int[] nums = {1, 0, -1, 0, -2, 2};
int target = 0;
System.out.println(fourSum(nums,target));
}
public static List<List<Integer>> fourSum(int[] nums,int target ){
List<List<Integer>> lists = new ArrayList<>();
if(nums.length<=3) {
return lists;
}
Arrays.sort(nums); //数组内利用二分法排序
int t2 = 2;
int t3 = nums.length-1; //指针初始化,分别指向尾部和前面三个数
for(int i=0;i<nums.length-3;i++) {
if(i>0 && nums[i-1]==nums[i]) {continue;}//跳过第一个和第二个相同的
for(int j=i+1;j<nums.length-2;j++) {
if(j>i+1 && nums[j-1]==nums[j]) {continue;} //跳过第二个和第三个相同的
t2 = j+1; //指针指向第三个
t3 = nums.length-1; //指针指向第四个数(尾部开始)
while(t2<t3) {
int sum = nums[i]+nums[j]+nums[t2]+nums[t3];
if(sum == target) {
//将数组转换成集合并添加进去
lists.add(Arrays.asList(nums[i],nums[j],nums[t2],nums[t3]));
while(t2<t3 && nums[t2] == nums[t2+1]) {t2++;} //跳过第三个与第四个相同的
while(t2<t3 && nums[t3] == nums[t3-1]) {t3--;} //跳过第四个与第三个相同
t2++; //指针更新
t3--; //指针更新
}else if(sum > target) {
t3--; //向前寻找合适的值
}else if(sum<target) {
t2++; //向后寻找合适的值
}
}
}
}
return lists;
}
}