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;
    }
};
相关推荐
weixin_4461224627 分钟前
LinkedList剖析
算法
百年孤独_2 小时前
LeetCode 算法题解:链表与二叉树相关问题 打打卡
算法·leetcode·链表
我爱C编程2 小时前
基于拓扑结构检测的LDPC稀疏校验矩阵高阶环检测算法matlab仿真
算法·matlab·矩阵·ldpc·环检测
算法_小学生2 小时前
LeetCode 75. 颜色分类(荷兰国旗问题)
算法·leetcode·职场和发展
运器1232 小时前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程
算法_小学生2 小时前
LeetCode 287. 寻找重复数(不修改数组 + O(1) 空间)
数据结构·算法·leetcode
岁忧2 小时前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
alphaTao2 小时前
LeetCode 每日一题 2025/6/30-2025/7/6
算法·leetcode·职场和发展
ゞ 正在缓冲99%…2 小时前
leetcode67.二进制求和
算法·leetcode·位运算
YuTaoShao2 小时前
【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
java·算法·leetcode