【DFS回溯】77. 组合

未优化剪枝版:

class Solution {
public:
    void dfs(vector<bool> &record, vector<int> &cur, int index){
        if(cur.size() == kk)
            result.emplace_back(cur);
        else{
            for(int i=index; i<=nn;++i)
                if(!record[i]){
                    record[i] = true;
                    cur.push_back(i);
                    dfs(record, cur, i + 1);
                    cur.pop_back();
                    record[i] = false;
                }
        }
    }

    vector<vector<int>> combine(int n, int k) {
        nn = n;
        kk = k;
        vector<int> cur_num;
        vector<bool> record(n, false);
        dfs(record, cur_num, 1);
        return result;
    }
private:
    vector<vector<int>> result;
    int nn;
    int kk;
};

优化剪枝:

class Solution {
public:
    void dfs(vector<int> &cur, int index){
        if(cur.size() == kk)
            result.push_back(cur);
        else{
            for(int i=index; i<=nn - (kk - cur.size()) + 1;++i){
                cur.push_back(i);
                dfs(cur, i + 1);
                cur.pop_back();
            }
        }
    }

    vector<vector<int>> combine(int n, int k) {
        nn = n;
        kk = k;
        vector<int> cur_num;
        dfs(cur_num, 1);
        return result;
    }
private:
    vector<vector<int>> result;
    int nn;
    int kk;
};
posted @ 2022-03-01 16:27  fwx  阅读(8)  评论(0)    收藏  举报