// 定义一个名为Solution的类
class Solution {// 初始化一个用于存储结果的列表,其中每个元素是一个整数列表,表示一组组合List<List<Integer>> result = new ArrayList<>();// 初始化一个LinkedList用于存储当前路径上的整数LinkedList<Integer> path = new LinkedList<>();// 公共方法:combinationSum3,输入参数为整数k(组合中元素的数量)和整数n(组合元素之和的目标值)public List<List<Integer>> combinationSum3(int k, int n) {// 调用回溯辅助方法来生成所有可能的组合backTracking(n, k, 1, 0);// 返回所有满足条件的组合列表return result;}// 私有回溯辅助方法,用于递归地生成所有可能的组合// 参数包括目标总和(targetSum)、还需选择的元素个数(k)、当前起始搜索的整数值(startIndex)以及当前路径上元素的累计和(sum)private void backTracking(int targetSum, int k, int startIndex, int sum) {// 剪枝操作:如果当前路径上元素的累计和已经超过目标总和,则无需继续在此分支搜索if (sum > targetSum) {return;}// 终止条件:如果当前路径上元素个数已经达到k个if (path.size() == k) {// 如果此时的累计和正好等于目标总和,将当前路径复制一份存入结果列表if (sum == targetSum) {result.add(new ArrayList<>(path));}// 结束当前递归分支return;}// 遍历从startIndex开始的整数,由于题目暗示数字范围是1到9,所以这里做了一种减枝处理// 计算剩余可选择的元素的最大值for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {// 将当前整数i加入到路径中path.add(i);// 更新当前路径上元素的累计和sum += i;// 递归调用自身,进入下一层搜索,同时更新起始搜索值为i+1,以及新的累计和backTracking(targetSum, k, i + 1, sum);// 回溯:在返回上一层递归之前,从路径中移除刚才加入的整数i,并还原累计和path.removeLast();sum -= i;}}
}
这段代码实现了一个求解“组合总和 III”问题的类,目标是在数字1到9中选择k个不重复的数,使得它们的和等于给定的目标值n。通过回溯算法逐层递归地尝试各种可能性,同时运用剪枝技术减少无效搜索,最后将满足条件的组合添加到结果列表中。