代码随想录算法训练营第三十天|总结、332.重新安排行程、51.N皇后、37.解数独

代码随想录 (programmercarl.com)

总结

332.重新安排行程

欧拉通路和欧拉回路:

欧拉通路:对于图G来说,如果存在一条通路包含G的所有边,则该通路称为欧拉通路,也称欧拉路径。
欧拉回路:如果欧拉路径是一条回路,那么称其为欧拉回路。
欧拉图:含有欧拉回路的图是欧拉图。

题目中说必然存在一条有效路径,所以至少是半欧拉图,也可以是欧拉图。

深度优先搜索(DFS):

对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

遍历欧拉图——Hierholzier算法

主要步骤:从一个可能的起点出发,进行深度优先搜索,但是每次沿着辅助边从每个顶点移动到另外一个顶点的时候,都需要删除这个辅助边。如果没有可移动的路径,则将所在节点加入到栈中(先进后出==所以后面步骤4需要逆序输入),并返回。

算法思路:

1)任选一点为起始点,并记录;

2)从起点出发到达任意一个邻接点,新到达的点成为新的起点,删除经过的边,删除孤立点,记录经过的点;

3)重复步骤2直至回到初始点,此时到达步骤1,将本次记录的点和上次记录的点集合拼接。若本图成为空图,到达步骤4;

4)逆序输出所有记录点。

只有入度与出度差为 1 的节点会导致死胡同

====代码待更新====

51.N皇后

皇后们的约束条件:

  1. 不能同行
  2. 不能同列
  3. 不能同斜线

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

回溯算法主体里面需要放一个判断是否可以防止皇后Q的判断函数

其中对于不能同斜线,需要判断45°和135°,分别如下两种情况:

i - 2, j - 2
i - 1, j - 1
i, j
i - 2, j + 2
i - 1, j + 1
i, j


Java中ArrayList与LinkedList的区别 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/33141246补充一点ArrayList和LinkedList的区别:

1、ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。

2、对于随机访问,ArrayList优于LinkedList

3、对于插入和删除操作,LinkedList优于ArrayList

4、LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

class Solution {List<List<String>> res = new ArrayList<>();//需要在一开始就声明,因为后面res.add(Array2List(chessboard));会用到public List<List<String>> solveNQueens(int n) {//初始化所有棋盘格为.char[][] chessboard = new char[n][n];//注意此处的棋盘里面放的都是字符,所以需要定义为char类型的数组for (char[] c : chessboard) {Arrays.fill(c, '.');}backtracking(n, 0, chessboard);return res;}public void backtracking(int n, int row, char[][] chessboard){//n表示该棋盘格的规格大小,row表示当前遍历到的行数if (row == n){//表示递归终止条件,开始收集结果res.add(Array2List(chessboard));return;}for (int col = 0; col < n; col++) {if (isValid(n, row, col, chessboard)){chessboard[row][col] = 'Q';backtracking(n, row + 1, chessboard);chessboard[row][col] = '.';//回溯回去}}}public List Array2List(char[][] chessboard){//表示将数组类型的结果转为所需要的list的集合形式List<String> list = new ArrayList<>();for (char[] c : chessboard) {list.add(String.copyValueOf(c));}return list;}public boolean isValid(int n, int row, int col, char[][] chessboard){//以下操作相当于剪枝,即如果有违反题目要求的情况出现,直接就不进行回溯,减少进入递归的次数//检查列,以为此时调用该方法是固定列,这时遍历行去检查列,改变col去检查行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; i--, j++) {if (chessboard[i][j] == 'Q'){return false;}}return true;}
}

37.解数独

class Solution {public void solveSudoku(char[][] board) {//没有new新的数组,直接修改原来传入的数组,所以返回值为voidbacktracking(board);}public boolean backtracking(char[][] board){//不需要终止条件,因为一旦该数独没有解,会直接返回false,不会陷入死循环//一个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++) {if (isValid(i, j, k, board)){board[i][j] = k;if (backtracking((board))){// 如果找到合适一组立刻返回return true;}board[i][j] = '.';}}return false;// 因为如果一行一列确定下来了,这里尝试了9个数都不行,说明这个棋盘找不到解决数独问题的解!// 那么会直接返回,这也就是为什么没有终止条件也不会永远填不满棋盘而无限递归下去!}}// 遍历完没有返回false,说明找到了合适棋盘位置了return true;}public boolean isValid(int row, int col, char val, char[][] board){//检查同一行是否有重复for (int j = 0; j < 9; j++) {if (board[row][j] == val){return false;}}//检查同一列是否有重复for (int i = 0; i < 9; i++) {if (board[i][col] == val){return false;}}//检查同一个九宫格是否有重复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.rhkb.cn/news/233734.html

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

相关文章

06-微服务-SpringAMQP

SpringAMQP SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能&#xff1a; 自动声明队列、交…

Scrum的工件

我们采用了Scrum进行开发方面的管理&#xff0c;那么所有的计划和工作都应该是透明的&#xff0c;这给了我们检查这些东西的机会&#xff0c;以便能够即时做出调整来适应即将发生的变化。 那么Scrum为我们设计了一些工件帮助我们检查我们的工作和计划&#xff0c;每个工件都有…

QT qss文件设置样式

方式一 &#xff08;单个&#xff09; 方式二 &#xff08;全局&#xff09; 所有按钮都会采用这个样式。 方式三 &#xff08;qss文件&#xff09; 创建资源文件 创建qss文件&#xff08;Button.qss&#xff09; 引用qss文件 QApplication a(argc, argv);QString qss;QFile…

元数据管理平台对比预研 Atlas VS Datahub VS Openmetadata

大家好&#xff0c;我是独孤风。元数据管理平台层出不穷&#xff0c;但目前主流的还是Atlas、Datahub、Openmetadata三家&#xff0c;那么我们该如何选择呢&#xff1f; 本文就带大家对比一下,这三个平台优势劣势。要了解元数据管理平台&#xff0c;先要从架构说起。 正文共&am…

k8s的pod基础

pod概念 pod是k8s中最小的资源管理组件。 pod也是最小化运行容器化的应用的资源管理对象。 pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合。 在一个pod当中运行一个容器是最常用的方式。在一个pod当中同时运行多个容器&#xff0c;在一个pod当中…

阿里云服务器ECS入门与基础运维

一、云服务器简介 1、服务器&#xff1a; (1) 概念&#xff1a; 服务器本身就是一种电脑&#xff0c;同样具备CPU、内存、硬盘、网卡、电源等硬件。 互联网对外提供网站、游戏、在线会议、网盘等服务&#xff0c;都需要将这些互联网服务部署到服务器中。 (2) 特点&#xf…

通过盲对抗性扰动实时击败基于DNN的流量分析系统

文章信息 论文题目&#xff1a;Defeating DNN-Based Traffic Analysis Systems in Real-Time With Blind Adversarial Perturbations 期刊&#xff08;会议&#xff09;&#xff1a;30th USENIX Security Symposium 时间&#xff1a;2021 级别&#xff1a;CCF A 文章链接&…

校招社招,认知能力测验,③如何破解语言常识类测试题?

作为认知能力测评中的一个环节&#xff0c;语言常识类&#xff0c;是大概率的出现&#xff0c;不同的用人单位可能略有不同&#xff0c;语言是一切的基础&#xff0c;而常识则意味着我们的知识面的宽度。 语言常识类的测试&#xff0c;如果要说技巧&#xff1f;难说....更多的…

el-table 展开行表格,展开的内容高度可以变化时,导致的固定列错位的问题

问题描述 一个可展开的表格&#xff08;列设置了type“expand”&#xff09;&#xff0c;并且展开后的内容高度可以变化&#xff0c;会导致后面所有行的固定列错位&#xff0c;图如下&#xff0c;展示行中是一个树形表格&#xff0c;默认不展示子级&#xff0c;点击树形表格的…

面试算法102:加减的目标值

题目 给定一个非空的正整数数组和一个目标值S&#xff0c;如果为每个数字添加“”或“-”运算符&#xff0c;请计算有多少种方法可以使这些整数的计算结果为S。例如&#xff0c;如果输入数组[2&#xff0c;2&#xff0c;2]并且S等于2&#xff0c;有3种添加“”或“-”的方法使…

TS 36.211 V12.0.0-下行(8)-调制和上变频

本文的内容主要涉及TS 36.211&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

[Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC)

前面通过deployment结合service来部署无状态的应用,下面来讲解通过satefulSet结合service来部署有状态的应用 一.StatefulSet详解 1.有状态和无状态区别 无状态: 无状态(stateless)、牲畜(cattle)、无名(nameless)、可丢弃(disposable) 有状态: 有状态(stateful)、宠物(pet)…

centos通过yum安装redis

1. 安装yum添加epel源(此步根据环境&#xff0c;如果有源则可跳过&#xff0c;在阿里去可跳过&#xff09; yum install epel-release 2 使用yum安装Redis yum install redis 出现如下图所示的内容&#xff0c;默认的安装路径是在 /usr/bin目录下&#xff1a; 文件安装路径…

Postman Newman 教程:轻松管理 API 自动化测试步骤

Postman 中的 Newman 是什么&#xff1f; Newman 是一个 CLI&#xff08;命令行界面&#xff09;工具&#xff0c;用于运行 Postman 中的集合&#xff08;Collection&#xff09;和环境&#xff08;Environment&#xff09;来进行自动化测试。它允许直接从命令行运行 Postman …

学会这三步,让你的营销文案更出彩

在内容为王的今天&#xff0c;品牌的所有动作都是为了营销&#xff0c;一个好的营销文案带来的传播价值是难以想象的。而创意与个性化是品牌文案成功的关键因素&#xff0c;让品牌营销更具层次感&#xff0c;今天媒介盒子就来分享让营销文案更出彩的办法。 一、 引用名师名句 …

听GPT 讲Rust源代码--compiler(31)

File: rust/compiler/rustc_ast_passes/src/node_count.rs 在Rust源代码的rust/compiler/rustc_ast_passes/src/node_count.rs文件中&#xff0c;它定义了Rust编译器中的AST节点计数器。该文件的作用是统计不同类型的AST节点在程序中的数量&#xff0c;以便在优化和调试过程中能…

LaTex引用字体变色

使用下面这条语句进行修改。 ‘citecolor’改变参考文献颜色&#xff0c; ‘linkcolor’改变图标公式引用的颜色&#xff0c; ‘urlcolor’ 文本网站超链接颜色。 \usepackage[colorlinks,bookmarksopen,bookmarksnumbered,citecolorblue, linkcolorblue, urlcolorblue]{hyper…

Spring AOP概念

什么是 AOP &#xff1f; AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是 Spring …

软件测试|Python字符串拼接详细解析

简介 在Python编程中&#xff0c;字符串拼接是一个非常常见的操作&#xff0c;它允许我们将多个字符串连接成一个新的字符串。字符串拼接在处理文本和数据时非常有用&#xff0c;比如构建消息、生成文件路径、格式化输出等。在本文中&#xff0c;我们将深入探讨Python中字符串…

JavaScript基础(25)_dom查询练习(二)

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>dom查询练习二</title><link rel"stylesheet" href"../browser_default_style/reset.css"><style>form {margi…