力扣组合三连-做题记录

组合系列链接

组合一组合二以及组合三

三题的详细题解链接里面很多,不懂就过去看

组合一

题目:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
在这里插入图片描述

这个题用回溯解决,所以就有了模板,直接上代码。

class Solution {
    
    
private:
    vector<vector<int>> result;
    vector<int> path;
    void bfs(int n,int k,int startIndex){
    
    
        if(path.size()==k){
    
    //终止条件
            result.push_back(path);
            return ;
        }
        for(int i=startIndex; i<=n; i++){
    
    
            path.push_back(i);
            bfs(n,k,i+1);
            path.pop_back();
        }

    }
public:
    vector<vector<int>> combine(int n, int k) {
    
    
        bfs(n,k,1);
        return result;
    }
};

组合二

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
新增条件candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。

示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]

这个题也是回溯,模板继续套用,但是多了一些剪枝条件

class Solution {
    
    
public:
    void dfs(vector<int> candidates,int target,int rus,vector<vector<int>>& x,vector<int>& y)
    {
    
    
        if(target<0)return;
        if(target==0){
    
    
            x.push_back(y);
            return ;
        }
        for(int i=rus;i<candidates.size();i++)
        {
    
    
            if(i>rus && candidates[i]==candidates[i-1])
                continue;//剪枝:去掉【1,2,5】和【1,2,5】重复出现的问题
            y.push_back(candidates[i]);
            dfs(candidates,target-candidates[i],i+1,x,y);//保证数据不会重复取用
            y.pop_back();
        }
    } 
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
    
    
        vector<vector<int>> x;
        vector<int> y;
        sort(candidates.begin(),candidates.end());
        dfs(candidates,target,0,x,y);
        return x;
    }
};

组合三

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:
所有数字都是正整数。
解集不能包含重复的组合。
示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]

扫描二维码关注公众号,回复: 12160023 查看本文章

这个依然是回溯,大的模板一致,也就是参数的变化和一些剪枝

class Solution {
    
    
public:
    void dfs(int k,int n,int pos,vector<vector<int>>& result,vector<int>& path)
    {
    
    
        if(n<0 || k<0) return ;
        if(n==0 && k==0)
        {
    
    
            result.push_back(path);
            return ;
        }
        for(int i=pos;i<10;i++)
        {
    
    
            //if()continue;
            path.push_back(i);
            dfs(k-1,n-i,pos+1,result,path);
            pos++;
            path.pop_back();
        }

    }
    vector<vector<int>> combinationSum3(int k, int n) {
    
    
        vector<vector<int>> result;
        vector<int> path;
        dfs(k,n,1,result,path);
        return result;
    }
};

笔记比较简略,不懂就回去看题解

猜你喜欢

转载自blog.csdn.net/qq_43337254/article/details/108567880
今日推荐