每日一题 77组合(剪枝)

题目

77

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2

输出:

\[2,4\], \[3,4\], \[2,3\], \[1,2\], \[1,3\], \[1,4\],

示例 2:

输入:n = 1, k = 1

输出:[[1]]

提示:

1 <= n <= 20

1 <= k <= n

题解

选或不选

java 复制代码
class Solution {
    private List<Integer> path = new ArrayList<>();
    private List<List<Integer>> ans = new ArrayList<>();
    private int k;
    public List<List<Integer>> combine(int n, int k) {
        this.k = k;
        dfs(n);
        return ans;
    }
    private void dfs(int i) {
        //可以选的个数
        int d = k - path.size();
        if (d == 0) {
            ans.add(new ArrayList<>(path));
            return;
        }
        if (i > d) {
            dfs(i - 1);
        }
        path.add(i);
        dfs(i - 1);
        path.remove(path.size() - 1);
    }
}

答案视角

java 复制代码
class Solution {
    private List<Integer> path = new ArrayList<>();
    private List<List<Integer>> ans = new ArrayList<>();
    private int k;
    public List<List<Integer>> combine(int n, int k) {
        this.k = k;
        dfs(n);
        return ans;
    }
    private void dfs(int i) {
        int d = k - path.size();
        if (d == 0) {
            ans.add(new ArrayList<>(path));
            return;
        }
        for (int j = i; j >= d; j--) {
            path.add(j);
            dfs(j - 1);
            path.remove(path.size() - 1);
        }
    }
}
相关推荐
j_xxx404_3 分钟前
LeetCode模拟算法精解I:替换问号,提莫攻击与Z字形变换
开发语言·数据结构·c++·算法·leetcode
IT痴者3 分钟前
Kotlin 开发注意事项(Android Java 开发者转型指南)
android·java·kotlin
wuqingshun3141595 分钟前
产生死锁的四个必要条件
java·jvm
青槿吖5 分钟前
第二篇:Spring MVC进阶:注解、返回值与参数接收的花式玩法
java·开发语言·后端·mysql·spring·mvc·mybatis
共享家95277 分钟前
Java入门(抽象类 与 接口)
java·开发语言
hanbr7 分钟前
C++ string类模拟实现(完整版,含全运算符重载)
java·开发语言
xUxIAOrUIII8 分钟前
【Go每日面试题】内存管理
java·开发语言·golang
森屿山茶10 分钟前
hot100题解 —— 146.LRU缓存
java·开发语言
gameboy03110 分钟前
SpringbootActuator未授权访问漏洞
java
⑩-10 分钟前
API 网关的作用?Spring Cloud Gateway 原理?
java·服务器·网络·spring cloud