[LeetCode] 77. Combinations

来源:互联网 发布:网易博客发帖软件 编辑:程序博客网 时间:2024/06/04 19:17

思路:
思路1是我自己想到的最简单的DFS, 然后https://discuss.leetcode.com/topic/11718/backtracking-solution-java
这里看到了很炫酷的优化, 其实就是起始值最大不是n, 而是n - k + 1, 比如n = 4, k = 2, 你不可能出现[4, X]的组合, 所以最多到3, 后面的就不用考虑了, 同理对于第i个位置的数字取值范围是[上一位数字 + 1, n - k + 1 + i]. 所以第二个代码就改了两个小处, 然而效率飙升.

void dfs(vector<vector<int>>& res, vector<int>& candidate, int start, int n, int k) {    if (candidate.size() == k) {        res.push_back(candidate);        return;    }    for (int i = start; i <= n; i++) {        candidate.push_back(i);        dfs(res, candidate, i + 1, n, k);        candidate.pop_back();    }}vector<vector<int>> combine(int n, int k) {    vector<vector<int>> res;    vector<int> candidate;    dfs(res, candidate, 1, n, k);    return res;}
void dfs(vector<vector<int>>& res, vector<int>& candidate, int start, int n, int k) {    if (candidate.size() == k) {        res.push_back(candidate);        return;    }    for (int i = start; i <= n; i++) {        candidate.push_back(i);        dfs(res, candidate, i + 1, n + 1, k);        candidate.pop_back();    }}vector<vector<int>> combine(int n, int k) {    vector<vector<int>> res;    vector<int> candidate;    dfs(res, candidate, 1, n - k + 1, k);    return res;}
0 0
原创粉丝点击