77. 组合

77. 组合

leetcode 77. 组合


题目:77. 组合

给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。

示例:

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

方法:Backtracking(回溯)

思路:Backtracking(回溯),先选一个数字,然后进入递归继续选,满足条件后加到结果中,然后回溯到上一步,继续递归(通过剪枝限制每次可选的数的范围,以提升效率),本次在组合采用的是顺序组合的方法以避免重复组合(假设n = 4,k = 2,组合时将1与2、3、4组合,2与3、4组合,3与4组合)。

运行数据:执行用时:1 ms,内存消耗:41 MB

复杂度分析:

  • 时间复杂度:O(k * C(k,n)),将结果加入结果集的时间复杂度为O(k),组合的时间复杂度为C(k,n)。
  • 空间复杂度:O(k),递归栈的深度为k。
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
// LeetCode指定调用方法 
public List<List<Integer>> combine(int n, int k) {

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

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

return result;
}

// 回溯,t记录当前可选元素的开始位置,combineList记录当前的组合数
private void backtracking(int t, int n, int k, List<List<Integer>> result, List<Integer> combineList) {

if (k == 0) {
result.add(new ArrayList<>(combineList));
return ;
}

// 剪枝(当从n个数中选k个数时,第一个数必定只能在1 ~ (n - k + 1)之间选,以保证后面还有k - 1个数可选)
for (int i = t; i <= n - k + 1; i++) {
combineList.add(i);
backtracking(i + 1, n, k - 1, result, combineList);
combineList.remove(combineList.size() - 1);
}
}

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

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


 
Your browser is out-of-date!

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

×