代码随想录算法训练营第30天(回溯算法06 | ● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独 ● 总结

回溯算法06

  • 332.重新安排行程(可跳过)
    • 解题思路
      • 难点
  • 51.N皇后(可跳过)
    • 解题思路
      • 回溯三部曲
      • 难点
  • 5. 解数独(可跳过)
    • 解题思路
      • 回溯三部曲
  • 总结篇(没来及看

332.重新安排行程(可跳过)

题目链接: 332.重新安排行程
文章讲解: 332.重新安排行程

解题思路

回溯三部曲

  1. 递归函数参数:
    全局变量map记录航班的映射关系
    ticketNum记录有多少个航班(终止条件会用上)。
    函数返回值我用的是bool,因为我们只需要找到一个行程,就是在树形结构中唯一的一条通向叶子节点的路线。
  2. 递归终止条件:
    终止条件是:我们回溯遍历的过程中,遇到的机场个数,如果达到了(航班数量+1),那么我们就找到了一个行程,把所有航班串在一起了。
    本题的result相当于 回溯算法中的path,也就是本题的result就是记录路径的(就一条),在如下单层搜索的逻辑中result就添加元素了。
  3. 单层搜索的逻辑
    回溯的过程中,如何遍历一个机场所对应的所有机场呢?
    本题既要找到一个对数据进行排序的容器,而且还要容易增删元素,迭代器还不能失效。

如果单纯的回溯搜索(深搜)并不难,难还难在容器的选择和使用上。

难点

  1. 题中要求:如果存在多种有效的行程,请你按字典排序返回最小的行程组合。因此要先对tickets进行排序,就可以保证找到的第一条路径就是最终的结果!如何排序
  2. 终止条件是什么?应该用何种容器存放遍历结果
  3. 单层递归逻辑是什么
  4. map,LinkedList,ArrayList的使用
// 回溯 代码随想录方法1  BBQ 超出时间限制了  二刷再看代码随想录的方法2吧
// 超时应该是容器用的不太合适
class Solution {private LinkedList<String> res;private LinkedList<String> path = new LinkedList<>();public List<String> findItinerary(List<List<String>> tickets) {Collections.sort(tickets, (a, b) -> a.get(1).compareTo(b.get(1)));path.add("JFK");boolean[] used = new boolean[tickets.size()];backTracking((ArrayList) tickets, used);return res;}public boolean backTracking(ArrayList<List<String>> tickets, boolean[] used){if(path.size() == tickets.size() + 1){res = new LinkedList(path);return true;}for(int i = 0; i < tickets.size(); i++){if(!used[i] && tickets.get(i).get(0).equals(path.getLast())){path.add(tickets.get(i).get(1));used[i] = true;if(backTracking(tickets, used)){return true;}used[i] = false;path.removeLast();}}return false;}
}

51.N皇后(可跳过)

题目链接: 51.N皇后
文章讲解: 51.N皇后
视频讲解: 51.N皇后

解题思路

棋盘的宽度就是for循环的长度,递归的深度就是棋盘的高度,这样就可以套进回溯法的模板里了。

回溯三部曲

  1. 递归函数参数
    全局变量二维数组result来记录最终结果。
    n是棋盘的大小
    row来记录当前遍历到棋盘的第几层了。
  2. 递归终止条件
    当递归到棋盘最底层(也就是叶子节点)的时候,就可以收集结果并返回了
  3. 单层搜索的逻辑
    递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。
    每次都是要从新的一行的起始位置开始搜,所以都是从0开始

难点

  • 定义二维char数组并将其值都初始化为’.’
  • 最后收集结果时,将二维char数组作为一个结果转化为String并放入到List中:Array2List(chessboard)
  • isValid判断每次放皇后的位置的合法性
class Solution {List<List<String>> res = new ArrayList<>();public List<List<String>> solveNQueens(int n) {char[][] chessboard = new char[n][n];for(char[] c : chessboard){Arrays.fill(c, '.');}backTracking(n, 0, chessboard);return res;}public void backTracking(int n, int row, char[][] chessboard){if(row == n){res.add(Array2List(chessboard));return;}for(int col = 0; col < n; col++){if(isValid(row, col, n, chessboard)){chessboard[row][col] = 'Q';backTracking(n, row + 1, chessboard);chessboard[row][col] = '.';}}}public List Array2List(char[][] chessboard){List<String> list = new ArrayList<>();for(char[] c : chessboard){list.add(String.copyValueOf(c));  // copyValueOf()方法将整个字符数组复制到字符串str中}return list;}public boolean isValid(int row, int col, int n, char[][] chessboard){// 检查列for(int i = 0; i < row; i++){if(chessboard[i][col] == 'Q'){return false;}}// 检查45度对角线for(int i = row-1, j=col-1; i>=0&&j>=0; i--, j--){if(chessboard[i][j] == 'Q'){return false;}}// 检查135度对角线for(int i = row-1, j=col+1; i>=0 && j<=n-1; i--, j++){if(chessboard[i][j] == 'Q'){return false;}}return true;}
}

5. 解数独(可跳过)

题目链接: 5. 解数独
文章讲解: 5. 解数独
视频讲解: 5. 解数独

解题思路

二维递归的思维逻辑

回溯三部曲

  1. 递归函数以及参数
    递归函数的返回值需要是bool类型,为什么呢?
    因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用bool返回值。
  2. 递归终止条件
    本题递归不用终止条件,解数独是要遍历整个树形结构寻找可能的叶子节点就立刻返回。
  3. 递归单层搜索逻辑
    我们需要的是一个二维的递归(也就是两个for循环嵌套着递归)
    一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,一行一列确定下来之后,递归遍历这个位置放9个数字的可能性!
class Solution {public void solveSudoku(char[][] board) {solveSudokuHelper(board);}private boolean solveSudokuHelper(char[][] board){//「一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,// 一行一列确定下来之后,递归遍历这个位置放9个数字的可能性!」for (int i = 0; i < 9; i++){ // 遍历行for (int j = 0; j < 9; j++){ // 遍历列if (board[i][j] != '.'){ // 跳过原始数字continue;}for (char k = '1'; k <= '9'; k++){ // (i, j) 这个位置放k是否合适if (isValidSudoku(i, j, k, board)){board[i][j] = k;if (solveSudokuHelper(board)){ // 如果找到合适一组立刻返回return true;}board[i][j] = '.';}}// 9个数都试完了,都不行,那么就返回falsereturn false;// 因为如果一行一列确定下来了,这里尝试了9个数都不行,说明这个棋盘找不到解决数独问题的解!// 那么会直接返回, 「这也就是为什么没有终止条件也不会永远填不满棋盘而无限递归下去!」}}// 遍历完没有返回false,说明找到了合适棋盘位置了return true;}/*** 判断棋盘是否合法有如下三个维度:*     同行是否重复*     同列是否重复*     9宫格里是否重复*/private boolean isValidSudoku(int row, int col, char val, char[][] board){// 同行是否重复for (int i = 0; i < 9; i++){if (board[row][i] == val){return false;}}// 同列是否重复for (int j = 0; j < 9; j++){if (board[j][col] == val){return false;}}// 9宫格里是否重复int startRow = (row / 3) * 3;int startCol = (col / 3) * 3;for (int i = startRow; i < startRow + 3; i++){for (int j = startCol; j < startCol + 3; j++){if (board[i][j] == val){return false;}}}return true;}
}

总结篇(没来及看

今天这三道题都非常难,那么这么难的题,为啥一天做三道?
因为 一刷 也不求大家能把这么难的问题解决,所以 大家一刷的时候,就了解一下题目的要求,了解一下解题思路,不求能直接写出代码,先大概熟悉一下这些题,二刷的时候,随着对回溯算法的深入理解,再去解决如下三题。

大家今天的任务,其实是 对回溯算法章节做一个总结就行。

重点是看 回溯算法总结篇:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言第九弹---二维数组

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 二维数组 1、二维数组的创建 1.1、二维数组的概念 ​1.2、⼆维数组的创建 2、二维数组的初始化 2.1、不完全初始化 ​2.2、完全初始化 ​2.3、按照行初始化 ​2.4、…

如何使用Docker安装Spug并实现远程访问本地运维管理界面

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…

Vue开发之proxy代理的配置(附带uniapp代理配置)

vue 1.在vue.config.js中添加 devServer 属性中配置 proxy 属性 module.exports {productionSourceMap: false,publicPath: /,devServer: {port: 8085,proxy: {/api/admin: {target: http://10.58.104.70:6111,changeOrigin: true,pathRewrite: {/api/: /}},/api: {target: …

自动 卸载或安装 Python第三方库

在调用 pip.exe 时&#xff0c;可以使用相对路径也可以使用绝对路径 路径中如果包含空格&#xff0c;最好使用相对路径&#xff0c;这就要求 pip.exe 所在文件夹设置为环境变量 可以参考&#xff1a; Windows下将文件夹设置为环境变量 echo off setlocal enabledelayedexpansi…

UE创建数据表格

创建一个数据表格需要行结构 继承自FTableRowBase的一个子类 效果 如何使用它 在蓝图中给C该类型的指针变量选用 UDataTable类型的 FindRow()函数可查询并返回对应行的行结构 FTableRowBase GetAllRows()函数可以获得该数据表的所有行、

centos 安装mysql5.7教程

一&#xff0c;配置yum mysql5.7安装源 配置yum mysql5.7安装源 yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 配置mysql5.7安装源成功 查看配置成功的安装源 yum repolist enabled | grep "mysql*" 执行后看到已配…

环境监测与预报:探索天气预报查询API在生态保护中的作用

摘要 随着全球气候变化的加剧&#xff0c;生态保护已成为全球关注的焦点。天气预报API作为一种强大的工具&#xff0c;不仅能够提供实时的气象数据&#xff0c;还能在生态保护领域发挥重要作用。本文将探讨天气预报API如何帮助科学家、环保组织和政策制定者更好地理解和预测环…

什么是 Docker

1.什么是 Docker 1.1 官方定义 最新官网首页 # 1.官方介绍 - We have a complete container solution for you - no matter who you are and where you are on your containerization journey. - 翻译: 我们为你提供了一个完整的容器解决方案,不管你是谁,不管你在哪,你都可以…

vue3常用代码

文章目录 监听路由vue3 警告Feature flag __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.mitt、project/inject 无效解决方案 菜鸟做项目时发现很多 vue3 常用的代码&#xff0c;所以来总结一下&#xff01; 监听路由 import { useRoute } from "…

如何禁用 el-table 单独某一行,修改某一行样式等(最有效)

案例&#xff1a;根据el-table :data"tableData"中是否有invalidStatus值为1&#xff0c;如果是就是不禁用&#xff0c;否就禁用这一行&#xff0c;当然这个invalidStatus随意就行&#xff0c;只要在tabledata中的每一行数据中有这个属性就行&#xff0c;也就是row中…

Android创建保存Excel文件

Android开发生成保存Excel文件&#xff0c;首先下载两个jar包。下载地址&#xff1a;Android读写Excel文件的两个jar包资源-CSDN文库 poi-3.12-android-a.jar poi-ooxml-schemas-3.12-20150511-a.jar 把jar包放在app的libs文件夹下&#xff0c;引用jar我一般都在build.gradle的…

代码随想录算法训练营第四十一天(动态规划篇)|理论基础,509. 斐波那契数, 70. 爬楼梯, 746. 使用最小花费爬楼梯

动态规划理论基础 动态规划&#xff1a;每一个状态一定是由上一个状态推导出来的。 贪心&#xff1a;局部直接选最优的 解题步骤 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 509. 斐波那契数 题目…

conda-建立多个python环境

1. 安装 下载地址&#xff1a;Miniconda — miniconda documentation 2. 安装好了会自动配置环境变量&#xff0c;如果没有配置手动配置 3. 检查conda环境 4. 设置conda配置文件 在‪C:\Users\Administrator下新建文件【.condarc】 channels: //镜像地址- https://mirrors.…

girhub添加 SSH 密钥

1 打开终端 输入 ssh-keygen -t rsa -b 4096 -C "github邮箱地址"如果不需要密码可以一路回车 出现这个页面就是生存成功了 open ~/.ssh // 打开.ssh 找到id_rsa.pub复制出内容新建ssh密钥输入内容,保存即可

MacOS平台翻译OCR软件,双管齐下,还可自定义插件,为其添砖加瓦!

小编昨天为大家分享了Windows系统下的一款功能强大且免费的 OCR 开源工具 Umi-OCR。 今天则为大家推荐一款 MacOS系统下的一款 翻译 OCR 多功能双管齐下的桌面应用软件 Bob。这款软件虽然也上线了GitHub&#xff0c;但它不是一款开源软件&#xff0c;仓库只是作者为了用户反馈…

Mac M1 Parallels CentOS7.9 Deploy 禅道

禅道官网下载地址: https://www.zentao.net/download/max4.10-83276.html 一、官网下载 二、解压安装 将下载好的包传至CentOS7.9虚拟机 zhinian192 ~ % scp Downloads/ZenTaoPMS-max4.10-zbox_arm64.tar.gz root10.211.55.36:~ ZenTaoPMS-max4.10-zbox_arm64.tar.gz …

idea 打包跳过测试

IDEA操作 点击蓝色的小球 手动命令 mvn clean package -Dmaven.test.skiptrue# 下载源码![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ff15aad1c9a546b6ab0556b5b135f409.png)

Linux命令拓展

一、tr - 字符转换 效果展示&#xff1a; 将小写转换成大写 字符压缩 通式&#xff1a;tr -s 字符删除 通式&#xff1a;tr -d 补集 通式&#xff1a;tr -c 用法&#xff1a;随机密码 二、cut - 提取 通式&#xff1a;cut [选项] 文件 选项&#xff1a; -d&#xff1a;分隔符…

C语言实现归并排序算法(附带源代码)

归并排序 把数据分为两段&#xff0c;从两段中逐个选最小的元素移入新数据段的末尾。 可从上到下或从下到上进行。 动态效果过程演示&#xff1a; 归并排序&#xff08;Merge Sort&#xff09;是一种分治算法&#xff0c;它将一个数组分为两个子数组&#xff0c;分别对这两个…

VS2022联合Qt5开发学习10(QT5.12.3联合VTK在VS2022上开发医学图像项目4——ScrollBar控制对比度、切面位置)

这篇博文是接着VS2022联合Qt5开发学习7&#xff08;QT5.12.3联合VTK在VS2022上开发医学图像项目2——十字叉标注&#xff09;-CSDN博客这篇博文延伸开发医学图像的显示渲染相关项目&#xff0c;主要介绍的是在之前显示的图像上增加滑块控制。 用到的内容有&#xff1a; VS2022…