216. 组合总和 III
找出所有相加之和为 n 的 _k _个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
Solution
举个简单的例子,比如 :
输入: k = 3, n = 7
输出: [[1,2,4]]
其中 7 的二进制表示的方式为 【0000 0111】
只有一种情况,因此只需要通过二进制为去枚举进行&
运算即可if 1 << i & mask > 0
即这个条件成立的时候,说明匹配到了当前的二进制位
func combinationSum3(k int, n int) (ans [][]int) {
var temp []int
check := func(mask int)bool {
temp = nil
sum := 0
for i := 0; i < 9; i++ {
if 1 << i & mask > 0 {
temp = append(temp, i + 1)
sum += i + 1
}
}
return len(temp) == k && sum == n
}
for mask := 0; mask < 1 << 9; mask++ {
if check(mask) {
ans = append(ans, append([]int(nil), temp...))
}
}
return
}
class Solution {
public:
vector<int> temp;
vector<vector<int>> ans;
bool check(int mask, int k, int n) {
temp.clear();
for (int i = 0; i < 9; ++i) {
if ((1 << i) & mask) {
temp.push_back(i + 1);
}
}
return temp.size() == k && accumulate(temp.begin(), temp.end(), 0) == n;
}
vector<vector<int>> combinationSum3(int k, int n) {
for (int mask = 0; mask < (1 << 9); ++mask) {
if (check(mask, k, n)) {
ans.emplace_back(temp);
}
}
return ans;
}
};