leetcode216--组合总和III

1. 题意

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

2. 题解

2.1 回溯
cpp 复制代码
class Solution {
public:
    void search(int begin, vector<vector<int>> &ans,vector<int> &seq, int sum, 
    int n,int k) {
        
        if ( sum == n && seq.size() == k) {
            ans.emplace_back( seq );
            return;
        }
        if ( sum > n || seq.size() > k)
            return;


        for (int i = begin; i < 10; i++) {
            seq.emplace_back(i);
            search( i + 1,ans, seq, sum + i, n, k);
            seq.pop_back();
        }

    }

    vector<vector<int>> combinationSum3(int k, int n) {
        int mx = (9 + (10 - k)) * k / 2;

        vector<vector<int>> ans;
        if ( mx < n)
            return ans;

        vector<int> seq;
        search(1, ans, seq, 0, n, k);
        
        return ans;
    }
};
2.2 二进制枚举

直接枚举每一种可能,判断是否满足即可。

cpp 复制代码
class Solution {
public:
    bool check(int v, int n, int k) {

        int one_cnt  = 0;
        int sum = 0;
        for (int i = 0;i < 9; ++i) {
            if (v & (1 << i))
                one_cnt++, sum += i + 1;
        }

        return one_cnt == k && sum == n;
    }


    vector<vector<int>> combinationSum3(int k, int n) {
        
        vector<vector<int>> ans;
        vector<int> seq;
        for (int i = 1; i < (1 << 9); ++i) {

            if ( check(i, n, k) ) {
                seq.clear();
                for (int j = 0;j < 9; ++j) {
                    if ( i & (1 << j))
                        seq.emplace_back( j + 1);
                }
                ans.emplace_back(seq);
            }
        }

        
        return ans;
    }
};
相关推荐
顾安r7 分钟前
11.21 脚本 网页优化
linux·前端·javascript·算法·html
WolfGang0073211 小时前
代码随想录算法训练营Day27 | 56.合并区间、738.单调递增的数字、968.监控二叉树
算法
信奥卷王1 小时前
2025年9月GESPC++三级真题解析(含视频)
开发语言·c++·算法
努力学习的小廉1 小时前
我爱学算法之—— BFS之FLoodFill算法
算法·宽度优先
天选之女wow2 小时前
【Hard——Day8】65.有效数字、68.文本左右对齐、76.最小覆盖子串
linux·运维·redis·算法·leetcode
AI大模型学徒2 小时前
NLP基础(八)_马尔可夫模型
算法·机器学习·自然语言处理·nlp·概率论·马尔可夫模型
前端小L2 小时前
图论专题(十八):“逆向”拓扑排序——寻找图中的「最终安全状态」
数据结构·算法·安全·深度优先·图论·宽度优先
前端小L2 小时前
图论专题(十七):从“判定”到“构造”——生成一份完美的「课程表 II」
算法·矩阵·深度优先·图论·宽度优先
qq_433554543 小时前
C++ 稀疏表
开发语言·c++·算法
小白程序员成长日记3 小时前
2025.11.21 力扣每日一题
算法·leetcode·职场和发展