算法题(day22)- 组合

77. 组合 - 力扣(LeetCode)

和全排列不同的是不需要用flag记录每个元素是否使用过,循环每次都从 i + 1 开始,保证每个元素不被重复组合。 对于全排列来说,i每次都要从1开始,深度优先搜索。

class Solution {
public:
    vector<vector<int>> ans;
    void backtracking(vector<int> temp, int k, int n, int startIndex){
        if(temp.size() == k){
            ans.push_back(temp);
            return;
        }
        // 剪枝,对于剩余数组长度不够组合出答案时,剪去多余分支。
        for(int i = startIndex; i <= n - (k - path.size()) + 1; i++){
            temp.push_back(i);
            backtracking(temp, k, n, i + 1);
            temp.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        vector<int> temp;
        backtracking(temp, k, n, 1);
        return ans;
    }
};

顺便附上一个全排列的逻辑

void dfs(int u){
    //结束条件
    if(u == n){
        //将路径添加到ans中
        return;
    }
    //for循环代表当前节点的所有子节点
    for(int i = 1; i<=n; i++){
        if(!state[i]){
            //改变状态
            state[i] = true;
            num[u] = i;
            //深搜
            dfs(u+1);
            //恢复现场
            state[i] = false;
        }
    }
}

216. 组合总和 III - 力扣(LeetCode)

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> path;
    void find(int n, int k, int startIndex, int sum){
        if(sum > n) return;
        if(path.size() == k){
            if(sum == n)
                ans.push_back(path);
            return;
        }
        for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i++){
            path.push_back(i);
            sum += i;
            find(n, k, i + 1, sum);
            sum -= i;
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        find(n, k, 1, 0);
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值