/** * * @param nums * 排序后目标数组 * @param target * 累加目标数值 * @param k * 个数 * @param index * 起始下标 * @return */ private ArrayList<List<Integer>> kSum(int[] nums, int target, int k, int index) {
ArrayList<List<Integer>> res = new ArrayList<>();
if (index >= len) return res; if (k == 2) { // 两数取和 int i = index, j = len - 1; while (i < j) { // 满足条件塞入集合 if (target - nums[i] == nums[j]) { List<Integer> temp = new ArrayList<>(); temp.add(nums[i]); temp.add(nums[j]); res.add(temp); while (i < j && nums[i] == nums[i + 1]) // 跳过重复数值 i++; while (i < j && nums[j] == nums[j - 1]) // 跳过重复数值 j--; i++; j--; } else if (target - nums[i] > nums[j]) i++; else j--; } } else { for (int i = index; i < len - k + 1; i++) { // 调用递归 DFS ArrayList<List<Integer>> temp = kSum(nums, target - nums[i], k - 1, i + 1); // 若是有值返回则将该数塞入,无则不进行任何操作 if (temp != null && temp.size() > 0) { for (List<Integer> list : temp) { list.add(nums[i]); // 将满足条件数值塞入 } res.addAll(temp); } while (i < len - 1 && nums[i] == nums[i + 1]) // 跳过重复数值 i++; } } return res; }
注意:这里 len 定义的是个全局变量,初始值为 0
若 n 为 4,那程序应该是这样的:
1 2 3 4 5 6 7
int len = 0; public List<List<Integer>> fourSum(int[] nums, int target) { len = nums.length; Arrays.sort(nums); // 先排序 return kSum(nums, target, 4, 0); // 递归调用