leetcode77.组合

  1. 题目:
    给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
  2. 示例:
    输入: n = 4, k = 2
    输出:
    [
    [2,4],
    [3,4],
    [2,3],
    [1,2],
    [1,3],
    [1,4],
    ]
  3. 思路:
    回溯思想解决组合问题
    在这里插入图片描述
  4. 代码:
    回溯法:
class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        res.clear();
        if(n<=0||k<=0||k>n) return res;
        vector<int> c;
        generateCombinations(n,k,1,c);
        return res;
    }
private:
    vector<vector<int> > res;
    void generateCombinations(int n,int k,int start,vector<int>& c){
        if(c.size()==k){
            res.push_back(c);
            return;
        }
        for(int i=start;i<=n;i++){
            c.push_back(i);
            generateCombinations(n,k,i+1,c);
            c.pop_back();
        } 
    }
};

回溯法的剪枝:

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        res.clear();
        if(n<=0||k<=0||k>n) return res;
        vector<int> c;
        generateCombinations(n,k,1,c);
        return res;
    }
private:
    vector<vector<int> > res;
    void generateCombinations(int n,int k,int start,vector<int>& c){
        if(c.size()==k){
            res.push_back(c);
            return;
        }
        //还有k-c.size()个空位,所以,{i....n}中至少要有k-c.size()个元素
        //i最多为n-(k-c.size())+1
        for(int i=start;i<=n-(k-c.size())+1;i++){
            c.push_back(i);
            generateCombinations(n,k,i+1,c);
            c.pop_back();
        } 
    }
};

猜你喜欢

转载自blog.csdn.net/qq_14962179/article/details/86478048
今日推荐