代码随想录-算法训练营day24【回溯01:理论基础、组合】

ops/2024/9/25 13:20:59/

代码随想录-035期-算法训练营>算法训练营【博客笔记汇总表】-CSDN博客

第七章 回溯算法part01 
今日内容:● 理论基础 
● 77. 组合  详细布置 理论基础 其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。题目链接/文章讲解:https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html  
视频讲解:https://www.bilibili.com/video/BV1cy4y167mM  77. 组合  对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。 题目链接/文章讲解:https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html   
视频讲解:https://www.bilibili.com/video/BV1ti4y1L7cv 
剪枝操作:https://www.bilibili.com/video/BV1wi4y157er   往日任务
● day 1 任务以及具体安排:https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY  
● day 2 任务以及具体安排:https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG  
● day 3 任务以及具体安排:https://docs.qq.com/doc/DUGdqYWNYeGhlaVR6 
● day 4 任务以及具体安排:https://docs.qq.com/doc/DUFNjYUxYRHRVWklp 
● day 5 周日休息
● day 6 任务以及具体安排:https://docs.qq.com/doc/DUEtFSGdreWRuR2p4 
● day 7 任务以及具体安排:https://docs.qq.com/doc/DUElCb1NyTVpXa0Jj 
● day 8 任务以及具体安排:https://docs.qq.com/doc/DUGdsY2JFaFhDRVZH 
● day 9 任务以及具体安排:https://docs.qq.com/doc/DUHVXSnZNaXpVUHN4 
● day 10 任务以及具体安排:https://docs.qq.com/doc/DUElqeHh3cndDbW1Q 
●day 11 任务以及具体安排:https://docs.qq.com/doc/DUHh6UE5hUUZOZUd0 
●day 12 周日休息 
●day 13 任务以及具体安排:https://docs.qq.com/doc/DUHNpa3F4b2dMUWJ3 
●day 14 任务以及具体安排:https://docs.qq.com/doc/DUHRtdXZZSWFkeGdE 
●day 15 任务以及具体安排:https://docs.qq.com/doc/DUHN0ZVJuRmVYeWNv 
●day 16 任务以及具体安排:https://docs.qq.com/doc/DUHBQRm1aSWR4T2NK 
●day 17 任务以及具体安排:https://docs.qq.com/doc/DUFpXY3hBZkpabWFY 
●day 18 任务以及具体安排:https://docs.qq.com/doc/DUFFiVHl3YVlReVlr 
●day 19 周日休息
●day 20 任务以及具体安排:https://docs.qq.com/doc/DUGFRU2V6Z1F4alBH  
●day 21 任务以及具体安排:https://docs.qq.com/doc/DUHl2SGNvZmxqZm1X 
●day 22 任务以及具体安排:https://docs.qq.com/doc/DUHplVUp5YnN1bnBL  
●day 23 任务以及具体安排:https://docs.qq.com/doc/DUFBUQmxpQU1pa29C

目录

理论基础

0077_组合


理论基础

回溯法,一般可以解决如下几种问题:

  1. 组合问题:N个数里面按一定规则找出k个数的集合
  2. 切割问题:一个字符串按一定规则有几种切割方式
  3. 子集问题:一个N个数的集合里有多少符合条件的子集
  4. 排列问题:N个数按一定规则全排列,有几种排列方式
  5. 棋盘问题:N皇后,解数独等等

回溯法解决的问题都可以抽象为树形结构(N叉树),并给出了回溯法的模板。

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择: 本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径, 选择列表); // 递归回溯,撤销处理结果;}
}

0077_组合

class Solution0077 {//未剪枝优化
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combine(int n, int k) {
        backtracking(n, k, 1);
        return result;
    }

    public void backtracking(int n, int k, int startIndex) {
        if (path.size() == k) {//终止条件
            result.add(new ArrayList<>(path));
            return;
        }
        for (int i = startIndex; i <= n; i++) {
            path.add(i);
            backtracking(n, k, i + 1);
            path.removeLast();
        }
    }
}

package com.question.solve.leetcode.programmerCarl2._08_backtrackingAlgorithms;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class _0077_组合 {
}class Solution0077 {//未剪枝优化List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {backtracking(n, k, 1);return result;}public void backtracking(int n, int k, int startIndex) {if (path.size() == k) {//终止条件result.add(new ArrayList<>(path));return;}for (int i = startIndex; i <= n; i++) {path.add(i);backtracking(n, k, i + 1);path.removeLast();}}
}class Solution0077_2 {//剪枝优化List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {combineHelper(n, k, 1);return result;}/*** 每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围,就是要靠startIndex** @param startIndex 用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,...,n] )。*/private void combineHelper(int n, int k, int startIndex) {if (path.size() == k) {//终止条件result.add(new ArrayList<>(path));return;}for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) {path.add(i);combineHelper(n, k, i + 1);path.removeLast();}}
}

http://www.ppmy.cn/ops/29307.html

相关文章

uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之使用jar包插件

前言 如果你不会编写安卓插件,你可以先看看我之前零基础的文章(uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件), 我们使用第三方包,jar包编写安卓插件 开始 把依赖包,放到某个模块的/libs目录(myTestPlug/libs) 还要到build…

SqlSessionFactory

在Java中&#xff0c;SqlSessionFactory是MyBatis框架中的一个重要类&#xff0c;它用于创建SqlSession对象。SqlSession是MyBatis框架中用于执行SQL语句的主要对象&#xff0c;它提供了对数据库操作的各种方法。 SqlSessionFactory的主要作用是创建SqlSession对象&#xff0c…

有哪些ai自动生成图片软件?AI绘画工具推荐

AI绘画工具是近年来快速发展的一种创新技术&#xff0c;它可以通过算法和机器学习技术来自动生成图片。那么又有有哪些ai自动生成图片软件呢&#xff1f;下面是小编给大家的AI绘画工具推荐。 一、爱制作AI 爱制作AI是一款多功能的人工智能助手&#xff0c;具备AI问答、AI写作、…

ThreeJS:项目搭建

介绍如何基于Vite、Vue、React构建ThreeJS项目。 Vite项目 1. 初始化项目&#xff0c;命令&#xff1a;npm init vitelatest&#xff0c; 2. 安装依赖&#xff0c;命令&#xff1a;npm install&#xff0c; 3. 启动项目&#xff0c;命令&#xff1a;npm run dev。 4. 样式初始…

贪心算法、Dijkstra和A*类路径搜索算法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言系列文章目录前言1.贪心算法、Dijkstra和A*类路径搜索算法(1)greedy best frist search贪心算法(仅仅考虑启发式代价)1.核心思想2.构造启发式猜…

ROS学习笔记12——tf坐标变换

以ros自带的小乌龟作为案例的载体&#xff0c;完成通信方式、坐标变换等的练习&#xff0c;实现程序启动之初 产生两只乌龟&#xff0c;中间的乌龟(turtle1) 和 左下乌龟(turtle2), turtle2 会自动运行至turtle1的位置&#xff0c;并且键盘控制时&#xff0c;只是控制 turtle1 …

BKPUNIX

第二条等待寄存器同步&#xff0c;可以参考前边RTC框图部分。在图中可以看到有两个时钟&#xff0c;PCLK1和RTCCLK&#xff0c;PCLK1在主电源掉电时会停止&#xff0c;为了保证RTC主电源掉电正常工作&#xff0c;RTC里的寄存器都是在RTCCLK同步下进行变更的。当用PCLK驱动的总线…

Java线程池的七大参数说明

线程池中的七大参数如下&#xff1a; &#xff08;1&#xff09;corePoolSize&#xff1a;线程池中的常驻核心线程数。 &#xff08;2&#xff09;maximumPoolSize&#xff1a;线程池能够容纳同时执行的最大线程数&#xff0c;此值大于等于1。 &#xff08;3&#xff09;keepAl…