LeetCode-77-组合-回溯算法

回溯算法的一般可以解决的问题:

  1. 组合问题:如 LeetCode-77-组合LeetCode-39-组合总和LeetCode-40-组合总和ⅡLeetCode-216-组合总和ⅡLeetCode-17-电话号码的字母组合
  2. 分割问题:如 LeetCode-131-分割回文串LeetCode-93-复原IP地址
  3. 子集问题:如 LeetCode-78-子集LeetCode-90-子集ⅡLeetCode-491-递增子序列
  4. 排列问题:如 LeetCode-46-全排列LeetCode-46-全排列Ⅱ
  5. 棋盘问题:如 LeetCode-51-N皇后LeetCode-37-解数读

递归三部曲:

① 确定递归函数的参数和返回值;一般是 void,名字一般是 backtracking

② 确定终止条件;

③ 确定单层递归逻辑。

LeetCode-77-组合 解题思路:

  1. 确定递归函数的参数,需要 n, k, 还有一个变化的下标startIndex
  2. 确定终止条件,这个简单,当一维数组的长度等于 k ,说明已经够了,停止即可;
  3. 确定单层递归逻辑,这个需要考虑从哪里开始判断,题目中是从1开始,所以下标也从1 开始,在for循环里开始回溯,但是每次回溯后为了方便将下一个元素加进去,也就是回到树形结构的父节点,我们需要弹出一个元素,这个容易忽略。
    代码实现
java 复制代码
class Solution {
    /**
     * @param n 1~n
     * @param k 要求的个数
     * @return 返回范围 [1, n] 中所有可能的 k 个数的组合
     */
    public List<List<Integer>> combine(int n, int k) {
        backtracking(n,k,1);
        return res;
    }

    List<List<Integer>> res = new ArrayList<>();//二维数组,要返回的结果
    List<Integer> path = new ArrayList<>();// 树形结构走的路径,即能放进去的数
    public void backtracking(int n, int k, int startIndex){
        if (path.size() == k){// 终止条件
            res.add(new ArrayList<>(path));// 满足条件,将一维数组加到结果集中
            return;// 切记需要返回
        }
        for (int i = startIndex; i <= n; i++) {// 没有剪枝的情况
            path.add(i);
            backtracking(n,k,i+1);// 回溯
            path.remove(path.size()-1);// 还需要弹出一个元素,即表示回到上一步
        }
    }
}
相关推荐
小O的算法实验室36 分钟前
2026年ESWA,基于固定机巢的无人机输电杆塔、变电站与配电杆混合巡检任务分配与路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章60-点点距离
图像处理·人工智能·opencv·算法·计算机视觉
nlpming3 小时前
OpenCode Skills 文档
算法
无限进步_3 小时前
二叉搜索树完全解析:从概念到实现与应用场景
c语言·开发语言·数据结构·c++·算法·github·visual studio
05候补工程师3 小时前
深度解构 ROS 2:如何手动调通 Nav2 A* 路径规划引擎
linux·人工智能·经验分享·算法·机器人
上弦月-编程4 小时前
【C语言逻辑题】谋杀案凶手是谁?——经典矛盾推理题详解
算法
天若有情6734 小时前
逆向玩家狂喜!用C++野生写法一键破解线性加密(不规范但巨好用)
开发语言·c++·算法
风筝在晴天搁浅4 小时前
剑指Offer 60.n个骰子的点数
算法
ProgramHelpOa4 小时前
Optiver 2026 OA 全面复盘|26NG / Intern 最新高频题型整理
人工智能·算法·机器学习
feifeigo1234 小时前
基于无迹变换的电网概率潮流分析 MATLAB 实现
开发语言·算法·matlab