import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.List;
class
QuadrupleSumToTarget {
public
static
List<List<Integer>> searchQuadruplets(
int
[] arr,
int
target) {
Arrays.sort(arr);
List<List<Integer>> quadruplets =
new
ArrayList<>();
for
(
int
i =
0
; i < arr.length -
3
; i++) {
if
(i >
0
&& arr[i] == arr[i -
1
]) {
continue
;
}
for
(
int
j = i +
1
; j < arr.length -
2
; j++) {
if
(j > i +
1
&& arr[j] == arr[j -
1
]) {
continue
;
}
searchPairs(arr, target, i, j, quadruplets);
}
}
return
quadruplets;
}
private
static
void
searchPairs(
int
[] arr,
int
targetSum,
int
first,
int
second, List<List<Integer>> quadruplets) {
int
left = second +
1
;
int
right = arr.length -
1
;
while
(left < right) {
int
sum = arr[first] + arr[second] + arr[left] + arr[right];
if
(sum == targetSum) {
List<Integer> quadruplet =
new
ArrayList<>();
quadruplet.add(arr[first]);
quadruplet.add(arr[second]);
quadruplet.add(arr[left]);
quadruplet.add(arr[right]);
quadruplets.add(quadruplet);
left++;
right--;
while
(left < right && arr[left] == arr[left -
1
]) {
left++;
}
while
(left < right && arr[right] == arr[right +
1
]) {
right--;
}
}
else
if
(sum < targetSum) {
left++;
}
else
{
right--;
}
}
}
public
static
void
printQuad(List<Integer> vec,
int
target) {
int
[] array =
new
int
[vec.size()];
for
(
int
i =
0
; i < vec.size(); i++)
array[i] = vec.get(i);
List<List<Integer>> result = searchQuadruplets(array, target);
for
(
int
j =
0
; j < result.size(); j++) {
List<Integer> quadruplet = result.get(j);
if
(j ==
0
) {
System.out.print(
"["
);
}
System.out.print(
"["
);
for
(
int
i =
0
; i < quadruplet.size(); i++) {
System.out.print(quadruplet.get(i));
if
(i != quadruplet.size() -
1
) {
System.out.print(
", "
);
}
else
{
System.out.print(
"]"
);
}
}
if
(j != result.size() -
1
) {
System.out.print(
", "
);
}
else
{
System.out.print(
"]"
);
}
}
}
public
static
void
main(String[] args) {
List<Integer> vec = Arrays.asList(
4
,
1
,
2
, -
1
,
1
, -
3
);
int
target =
1
;
printQuad(vec, target);
}
}