代码随想录Day24 | 77、组合 | 回溯

87 阅读1分钟

77. 组合

题目链接:77. 组合

思路: 回溯的本质是暴力穷举。回溯法解决的问题都可以抽象为树形结构,解决一个回溯问题,实际上就是一个决策树的遍历过程。回溯法模版的其核心就是 for 循环里面的递归,在递归调用之前「做选择」,在递归调用之后「撤销选择」。

定义全局变量res来记录符合条件的路径,track来记录当前路径。使用回溯法的框架,第一步写结束条件,对于组合问题来说,当前路径的长度符合要求时,把当前track加入res,return。for循环代表每一步时的每一种选择,做出选择时,更新track,递归,出递归后,更新track撤销选择。

class Solution {
    
    // 记录回溯算法的递归路径
    List<List<Integer>> res = new LinkedList<>();
    // 记录当前路径
    LinkedList<Integer> track = new LinkedList<>();
   
    public List<List<Integer>> combine(int n, int k) {
        backtrack(n, 1, k);
        return res;
    }

    void backtrack(int n, int start, int k) {
        if (track.size() == k) {
            res.add(new LinkedList<>(track));
            return;
        }
        for (int i = start; i <= n; i++) {
            track.addLast(i);
            backtrack(n, i + 1, k);
            track.removeLast();
        }
    }
}

总结: