必须先排序
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> fournumber(ArrayList<Integer> nums, int target) {
int[] num = nums.stream().mapToInt(Integer::intValue).toArray();
Arrays.sort(num);
return nsum(num, 4, 0, target);
}
public ArrayList<ArrayList<Integer>> nsum(int[] num, int n, int start, int target) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
int len = num.length;
if (len < n) return res;
if (n == 2) {
int left = start;
int right = len - 1;
while (left < right) {
int sum = num[left] + num[right];
if (sum == target) {
ArrayList<Integer> temp = new ArrayList<>();
temp.add(num[left]);
temp.add(num[right]);
res.add(temp);
//类似快排,去重
while (left < right && num[left] == num[left + 1]) left++;
while (left < right && num[right] == num[right - 1]) right--;
left++;
right--;
} else if (sum < target) {
left++;
} else {
right--;
}
}
} else {
for (int i = start; i < len - n + 1; i++) {
//去重
if (i > start && num[i] == num[i - 1]) continue;
ArrayList<ArrayList<Integer>> sub = nsum(num, n - 1, i + 1, target - num[i]);
for (ArrayList<Integer> arr : sub) {
arr.add(num[i]);
res.add(arr);
}
}
}
return res;
}
}