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

题目描述

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

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

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

示例 2:
输入: k = 3, n = 9

题解1

二进制位法
1 9 1-9 所有数字的组合共有 2 9 2^9 种情况,将 0 2 9 1 0- 2^9-1 转成二进制数,然后判断个数和总和是否符合 k k n n 的要求。

代码1

/*
k 范围 1-9
组合之和最大为45
*/

class Solution {
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<vector<int>>res;
        if(k < 0 || k > 9 || n < 0 || n > 45){
            return res;
        }
        int len = 1 << 9, tmp, cnt = 0, sum = 0;
        vector<int>arr;
        for(int i = 0; i < len; ++i){
            tmp = i;
            cnt = 0;//统计数的个数
            sum = 0;//统计数的总和
            arr.clear();
            for(int j = 1; j <= 9; ++j){//转成二进制
                if(tmp % 2){
                    arr.push_back(j);
                    ++cnt;
                    sum += j;
                }
                tmp = tmp / 2;
            }
            if(cnt == k && sum == n){//判断是否符合条件
                res.push_back(arr);
            }
        }
        return res;
    }
};

执行结果1

执行结果1

发布了152 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/happyeveryday62/article/details/103818574