给定一个包含 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] ]
代码
class Solution {
public List
<List
<Integer>> fourSum(int[] nums
, int target
) {
List
<List
<Integer>> con
=new ArrayList<>();
int n
=nums
.length
;
Arrays
.sort(nums
);
for(int i
=0;i
<n
-3;i
++)
{
if(i
>0&&nums
[i
]==nums
[i
-1]) continue;
if(nums
[i
]+nums
[n
-1]+nums
[n
-2]+nums
[n
-3]<target
)
continue;
if(nums
[i
]+nums
[i
+1]+nums
[i
+2]+nums
[i
+3]>target
)
break;
for(int j
=i
+1;j
<n
-2;j
++)
{
if(j
>i
+1&&nums
[j
]==nums
[j
-1]) continue;
if(nums
[i
]+nums
[n
-1]+nums
[n
-2]+nums
[j
]<target
)
continue;
if(nums
[i
]+nums
[i
+1]+nums
[i
+2]+nums
[j
]>target
)
break;
int l
=j
+1,r
=n
-1;
while (l
<r
)
{
int sum
=nums
[l
]+nums
[r
]+nums
[i
]+nums
[j
];
if(sum
==target
)
{
con
.add(Arrays
.asList(nums
[i
],nums
[j
],nums
[l
],nums
[r
]));
while (l
<r
&&nums
[l
]==nums
[l
+1])
l
++;
l
++;
while (l
<r
&&nums
[r
]==nums
[r
-1])
r
--;
r
--;
}else if(sum
<target
)
l
++;
else r
--;
}
}
}
return con
;
}
}