LeetCode 77. Combinations
Given two integers n
and k
, return all possible combinations of k
numbers out of the range [1, n]
.
You may return the answer in any order.
Example 1:
Input: n = 4, k = 2
Output:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
method: 回溯
- 不能重复取,所以下一个要
i+1
vector<vector<int>> ret;
vector<int> path;
void dfs(int n, int k, int index) {
if (path.size() == k) { // 取了k个,记录结果返回
ret.push_back(path);
return;
}
for (int i = index; i <= n - (k - path.size()) + 1; ++i) {
path.push_back(i);
dfs(n, k, i + 1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
dfs(n, k, 1);
return ret;
}
剪枝:现在已经取了path.size()
个,还需要k-path.size()
个,但是总共只有n
个,所以必须从小于等于n-(k-path.size())+1
开始取,超过这个范围就取不了k
个了,+1
是因为下标从1
开始,如果从0
开始就不用了
比如n=4,k=3
,现在取了0
个,接下来的取数不能大于4-(3-0)+1=2
,也就是只可以从1,2
开始取,超过2
就取不到3
个数了