- 题目链接:216. 组合总和 III - 力扣(LeetCode): https://leetcode.cn/problems/combination-sum-iii/
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例1
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
示例2
输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,
我们可以得到的最小和是1+2+3+4 = 10,
因为10 > 1,没有有效的组合。
import java.util.ArrayList;
import java.util.List;
public class LeetCode216_01_01 {
// 定义结果集
public List<List<Integer>> ret = new ArrayList<>();
// 定义临时集合,存放每个组合
public List<Integer> tempList = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backTracking(n, k, 1);
return ret;
}
/**
*
* @param n 表示剩余需要的和
* @param k 表示剩余可以添加的个数
* @param startNum 表示起始的数字(因为数字不能重复)
*/
public void backTracking(int n, int k, int startNum) {
// 定义递归结束条件
if (k == 0) {
if (n == 0) ret.add(new ArrayList(tempList));
return;
} else if (n > k * 9) {
// 当剩余数字全部取最大值 9 时都无法满足,则结束递归
return;
} else if (n < 0) {
// 当n已经小于0时,结束递归
return;
}
for (int i = startNum; i < 10; i++) {
tempList.add(i);
backTracking(n - i, k - 1, i + 1);
tempList.remove(tempList.size() - 1);
}
}
}