k Sum II
//连续搜索
public class Solution {
/*
* @param A: an integer array
* @param k: a postive integer <= length(A)
* @param target: an integer
* @return: A list of lists of integer
*/
public List<List<Integer>> kSumII(int[] A, int k, int target) {
List<List<Integer>> res = new ArrayList<>();
dfs(A, k, 0, target, new ArrayList<Integer>(), res);
return res;
}
private void dfs(int[] nums, int k, int index, int target, List<Integer> path, List<List<Integer>> res) {
if (k == 0) {
if (target == 0) {
res.add(new ArrayList<>(path));
}
return;
}
if (target <0 || index == nums.length) return;
path.add(nums[index]);
dfs(nums, k - 1, index + 1, target - nums[index], path, res);
path.remove(path.size() - 1);
dfs(nums, k, index + 1, target, path, res);
}
}
//跳跃搜索dfs
private void dfs(int[] nums, int k, int index, int target, List<Integer> path, List<List<Integer>> res) {
if (k == 0) {
if (target == 0) {
res.add(new ArrayList<>(path));
}
return;
}
if (target <0) return; //这个地方算是减枝,并不算是递归出口
for (int i = index; i < nums.length; i++) {
path.add(nums[i]);
dfs(nums, k - 1, i + 1, target - nums[i], path, res);
path.remove(path.size() - 1);
}
}
最后更新于
这有帮助吗?