LeetCode - 216. Combination Sum III

发布于 2024-09-14 18:17:54 字数 3259 浏览 10 评论 0

题目

解析

这题其实也挺简单的,还是组合数的模板稍微改动一下。只不过将枚举数组中的元素改成 for(int i = cur; i <= 9; i++){ ,即枚举
cur ~ 9 ,而 cur 一开始自然是从 1 开始的。

import java.io.*;
import java.util.*;

class Solution {

    private List<List<Integer>> res;

    public List<List<Integer>> combinationSum3(int k, int n) {
        res = new ArrayList<>();
        dfs(0, k, 1, 0, n, new ArrayList<>());// d is depth 
        return res;
    }

    private void dfs(int d, int k, int cur, int curSum, int target, List<Integer>curr){ 
        if(d == k){
            if(curSum == target)
                res.add(new ArrayList<>(curr));
            return;
        }
        for(int i = cur; i <= 9; i++){ 
            if(curSum + i > target)
                break;
            curr.add(i);
            dfs(d + 1, k, i + 1, curSum + i, target, curr);
            curr.remove(curr.size() - 1);
        }
    }

    public static void main(String[] args){
        PrintStream out = System.out;
        int k = 3, n = 9;
        out.println(new Solution().
            combinationSum3(3, 9)
        );
    }
}

因为这里的数只从 1 ~ 9 ,所以这题还有一种做法就是利用二进制枚举 2 ^ 9 种可能。

  • 其中如果二进制(总共 9 位) 某位 i 上值为 1 ,则说明取了 i+1(因为二进制位数从 0 开始,但是这里是 1~9 (即从 1 开始));如果 i 位置上为 0 ,则没有取 i+1
  • 枚举所有的二进制数( 0 ~ 2^9 ),然后每个数,对应哪些位置上是有数的(值为 1 ),如果有,就累加,最后看是不是等于 n 即可;

例如:

二进制( 0 ~ 2^9 )对应集合
000000000[ ]
000000001[ 1 ]
000100011[ 1, 2, 6]
010101101[ 1, 3, 4, 6, 8]
111111110[ 2, 3, 4, 5, 6, 7, 8, 9]
111111111[1, 2, 3, 4, 5, 6, 7, 8, 9]
import java.io.*;
import java.util.*;

class Solution {

    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> res = new ArrayList<>();

        for(int mask = 0; mask < (1 << 9); mask++){ 
            List<Integer>cur = new ArrayList<>();
            int sum = 0;
            for(int i = 1; i <= 9; i++)
                // if( (mask & (1 << (i-1))) != 0){ 
                if( (( mask >> (i-1) ) & 1) == 1){// same as above
                    sum += i;
                    cur.add(i);
                }
            if(sum == n && cur.size() == k)
                res.add(new ArrayList<>(cur));
        }
        return res;
    }

    public static void main(String[] args){
        PrintStream out = System.out;
        int k = 3, n = 9;
        out.println(new Solution().
            combinationSum3(3, 9)
        );
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

妄断弥空

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文