// 主方法:求和为n的k个数的所有组合 public List<List<Integer>> combinationSum3(int k, int n) { // 从数字1开始进行回溯 backtracking(k, n, 1); // 返回结果列表 return result; }
// 回溯方法:生成符合条件的组合 publicvoidbacktracking(int k, int n, int startIndex) { // 递归终止条件:当路径中的数字数量达到k时 if (path.size() == k) { intsum=0; // 计算路径中所有数字的总和 for (inti=0; i < k; i++) sum += path.get(i); // 如果总和等于目标值n,则将该路径加入结果列表 if (sum == n) result.add(newArrayList<>(path)); return; // 终止当前递归 }
// 从startIndex开始遍历数字1到9 for (inti= startIndex; i <= 9; i++) { path.add(i); // 将当前数字加入路径 // 递归调用,将下一个数字加入路径,i+1确保每个数字只用一次 backtracking(k, n, i + 1); path.remove(path.size() - 1); // 回溯,移除路径中的最后一个数字 } } }
// 主方法:求和为n的k个数的所有组合 public List<List<Integer>> combinationSum3(int k, int n) { // 从数字1开始进行回溯 backtracking(k, n, 1); // 返回结果列表 return result; }
// 回溯方法:生成符合条件的组合 publicvoidbacktracking(int k, int n, int startIndex) { // 递归终止条件:当路径中的数字数量达到k时 if (path.size() == k) { intsum=0; // 计算路径中所有数字的总和 for (inti=0; i < k; i++) sum += path.get(i); // 如果总和等于目标值n,则将该路径加入结果列表 if (sum == n) result.add(newArrayList<>(path)); return; // 终止当前递归 }
// 优化后的循环:限制循环范围以减少不必要的遍历 // 当path.size()已选择的数字数和剩余的k-path.size()个数字无法满足1-9的范围时,循环提前结束 for (inti= startIndex; i <= 9 - (k - path.size()) + 1; i++) { path.add(i); // 将当前数字加入路径 // 递归调用,将下一个数字加入路径,i+1确保每个数字只用一次 backtracking(k, n, i + 1); path.remove(path.size() - 1); // 回溯,移除路径中的最后一个数字 } } }
// 主方法:求和为n的k个数的所有组合 public List<List<Integer>> combinationSum3(int k, int n) { // 初始化回溯,起始索引为1,总和为0 backtracking(k, n, 1, 0); // 返回结果列表 return result; }
// 回溯方法:生成符合条件的组合 publicvoidbacktracking(int k, int n, int startIndex, int sum) { // 递归终止条件:当路径中的数字数量达到k时 if (path.size() == k) { // 如果当前路径的总和等于目标值n,则将路径加入结果列表 if (sum == n) result.add(newArrayList<>(path)); return; // 终止当前递归 }
// 优化后的循环:限制循环范围以减少不必要的遍历 // 当剩余的数字数量不足以组成所需的k个数字时,提前结束循环 for (inti= startIndex; i <= 9 - (k - path.size()) + 1; i++) { path.add(i); // 将当前数字加入路径 //sum += i; // 更新当前路径的总和 // 递归调用,将下一个数字加入路径,i+1确保每个数字只用一次 backtracking(k, n, i + 1, sum + i); path.remove(path.size() - 1); // 回溯,移除路径中的最后一个数字 //sum -= i; // 恢复总和为添加当前数字之前的值 } } }