求解k数之和,必须要保证数组有序,方便后面跳过重复的数字,当k是2的时候,退化为求解2数之和
public static ArrayList<List<Integer>> kSum(int nums[], int target, int k, int start) {
// 必须要保证数组有序
Arrays.sort(nums);
ArrayList<List<Integer>> res = new ArrayList<List<Integer>>();
if (start >= nums.length)
return res;
if (k == 2) {
int l = start, h = nums.length - 1;
while (l < h) {
if (nums[l] + nums[h] == target) {
List<Integer> list = new ArrayList<>();
list.add(nums[l]);
list.add(nums[h]);
res.add(list);
while (l < h && nums[l] == nums[l + 1])
l++;
while (l < h && nums[h] == nums[h - 1])
h--;
l++;
h--;
} else if (nums[l] + nums[h] < target)
l++;
else
h--;
}
return res;
}
if (k > 2) {
for (int i = start; i < nums.length - k + 1; i++) {
// 求k-1数之和为target-nums[i]
ArrayList<List<Integer>> temp = kSum(nums, target - nums[i], k - 1, i + 1);
// 对于得到的k-1数之和为target-nums[i]的所有集合,都添加上nums[i]就得到了k数之和为target的集合
if (temp != null) {
for (List<Integer> l : temp) {
l.add(0, nums[i]);
}
res.addAll(temp);
}
// 为了跳过那些重复的数据
while (i < nums.length - 1 && nums[i] == nums[i + 1]) {
i++;
}
}
return res;
}
return res;
}








网友评论