题目描述
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:
输入: k = 3, n = 9
题解1
二进制位法
所有数字的组合共有
种情况,将
转成二进制数,然后判断个数和总和是否符合
与
的要求。
代码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;
}
};