题目
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
思路
- 三数之和的进阶版,比三数之和多一层循环
- 首先第一层循环,
i从0到len-3
,剩下就是三数求和的问题了 - 注意一点就是,第一层循环开始有一个去重条件是:
if(i == 0 || (i>0 && nums[i] != nums[i-1]))
。对应的第二层循环也有一个去重的条件,这里不是if(j == 1 || nums[j] != nums[j-1])
,而是if(j == i+1 || nums[j] != nums[j-1])
代码
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums); //排序
int len = nums.length,sum;
for(int i=0; i<len-3; i++){
if(i == 0 || (i>0 && nums[i] != nums[i-1])) //对第一个数去重
{
for(int j=i+1; j<len-2; j++){
sum = target-nums[i]-nums[j];
if(j == i+1 || nums[j] != nums[j-1]){ //对第二个数去重
int l = j+1, r = len-1;
while(l<r){
if(nums[l]+nums[r] == sum){
res.add(Arrays.asList(nums[i],nums[j],nums[l],nums[r]));
while(l<r && nums[l]==nums[l+1]) l++; //对第三个数去重
while(l<r && nums[r]==nums[r-1]) r--; //对第四个数去重
l++;
r--;
}
else if(nums[l]+nums[r] < sum){
while(l<r && nums[l]==nums[l+1]) l++; //对第三个数去重
l++;
}
else{
while(l<r && nums[r]==nums[r-1]) r--; //对第四个数去重
r--;
}
}
}
}
}
}
return res;
}
}