216. 组合总和 III

216. 组合总和 III

leetcode 216. 组合总和 III


题目:216. 组合总和 III

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

  • 所有数字都是正整数。
  • 解集不能包含重复的组合。

示例1:

输入: k = 3, n = 7
输出: [[1,2,4]]

示例2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

方法:Backtracking(回溯)

思路:Backtracking(回溯)。
运行数据:执行用时:0 ms,内存消耗:37.1 MB

复杂度分析:

  • 时间复杂度:O(n * 2^n),n为9,生成所有子集的时间复杂度O(2^n),复制到输出集合中的时间复杂度O(n)。
  • 空间复杂度:O(n),n为9,回溯递归时保存临时组合。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// LeetCode指定调用方法 
public List<List<Integer>> combinationSum3(int k, int n) {

List<List<Integer>> result = new ArrayList<>();

backtracking(k, n, result, new ArrayList<>(), 1);

return result;
}

// 回溯,记录当前candidates的开始位置起始元素
private void backtracking(int k, int n, List<List<Integer>> result, List<Integer> combinationSum3List, int t) {

if (n == 0 || k == 0) {
if (n == 0 && k == 0) {
result.add(new ArrayList<>(combinationSum3List));
}
return ;
}

for (int i = t; i <= 9; i++) {
if (i > n) {
break;
}
combinationSum3List.add(i);
backtracking(k - 1, n - i, result, combinationSum3List, i + 1);
combinationSum3List.remove(combinationSum3List.size() - 1);
}

}

学习所得,资料、图片部分来源于网络,如有侵权,请联系本人删除。

才疏学浅,若有错误或不当之处,可批评指正,还请见谅!


 
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×