G
N
I
D
A
O
L

216. 组合总和 III_2022_02_02

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;
}
};
posted @   StimuMing  阅读(30)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示