代码随想录算法训练营第三十天|总结、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新的数组,直接修改原来传入的数组,所以返回值为void
        backtracking(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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

了解什么是UV纹理?

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 什么是UV&#xff1f; UV 是与几何图形的顶点信息相对应的二维纹理坐…

Spring见解 1.2 IOC

2.3.Spring的IOC解决程序耦合 2.3.1.创建工程 2.3.1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

人工智能图像生成的道德利弊

目录 一、我们应该关注人工智能图像吗&#xff1f;二、利用人工智能增强创造力的积极作用三、版权和剽窃问题四、对就业和劳动力动态的影响五、无意识的偏见和影响六、负责任地前行 人工智能&#xff08;AI&#xff09;发展迅速&#xff0c;尤其是近年来。据估计&#xff0c;超…

密码学:一文读懂非对称密码体制

文章目录 前言非对称密码体制的保密通信模型私钥加密-公钥解密的保密通信模型公钥加密-私钥解密的保密通信模型 复合式的非对称密码系统散列函数数字签名数字签名满足的三个基本要求先加密还是先签名&#xff1f;数字签名成为公钥基础设施以及许多网络安全机制的基础什么是单向…

js数组循环,当前循环完成后执行下次循环

前言 上图中&#xff0c;点击播放icon&#xff0c;图中左边地球视角会按照视角列表依次执行。u3D提供了api,但是我们如何保证在循环中依次执行。即第一次执行完成后&#xff0c;再走第二次循环。很多人的第一思路就是promise。对&#xff0c;不错&#xff0c;出发的思路是正确的…

新颖度爆表。网络药理学+PPI+分子对接+实验验证

今天给同学们分享一篇生信文章“The convergent application of metabolites from Avena sativa and gut microbiota to ameliorate non-alcoholic fatty liver disease: a network pharmacology study”&#xff0c;这篇文章发表在J Transl Med期刊上&#xff0c;影响因子为7.…

现阶段鸿蒙开发薪资高于传统开发岗位的30%~50%

近期&#xff0c;多家互联网公司发布了多个和鸿蒙系统有关的岗位。 11月10日&#xff0c;网易更新了高级/资深Android开发工程师岗位&#xff0c;职位要求参与云音乐多端多os的产品&#xff08;Android、鸿蒙等&#xff09;研发迭代。11月8日&#xff0c;美团发布了鸿蒙高级工…

Docker简述与基础部署详解

docker官网&#xff1a;https://www.docker.com docker中文库:https://www.docker.org.cn/ Docker是一种开源的容器化平台&#xff0c;用于轻松打包、交付和运行应用程序。Docker的主要优势在于它提供了一种轻量级、可移植、自包含的容器化技术&#xff0c;使得应用程序及其所…

一次因线程池使用不当造成生产事故OOM

美好的一天从bug结束 某日当我点开熟悉的界面&#xff0c;一个又一个请求失败的提示赫然出现在屏幕上&#xff0c;不会是昨晚上线的代码有问题吧&#xff1f; 吓得我急忙按F12查看了响应——"exception":"java.lang.OutOfMemoryError","message"…

过滤器和拦截器

上篇文章我们学习了 Session 认证和 Token 认证&#xff0c;这篇我们来学习一下过滤器和拦截器&#xff0c;过滤器和拦截器在日常项目中经常会用到。 一、过滤器 1.1、理论概念 过滤器 Filter 是 JavaWeb 三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一&am…

react-native下载图片到本地相册

需求 点击右上角下载icon&#xff0c;可以将当前图片下载并保存到本地相册。 下载的图片&#xff1a; 流程 下载图片的本质其实是&#xff0c; 固定需要下载的页面内容和样式 》将其放在当前页面不可见区域 》点击下载按钮 》穿一个ref给native&#xff0c;会自动拉起手机系…

2024最新外贸建站:ChemiCloud主机购买使用及自建外贸独立站教程

随着电商平台竞争的加剧&#xff0c;许多外贸从业者意识到减少对平台依赖的重要性&#xff0c;并选择搭建自己的外贸独立站来获得更多的控制权和灵活性。即使是没有建站基础的新手&#xff0c;也可以通过学习建站来实现这一目标。下面是一个适用于新手的外贸建站教程&#xff0…

【Java】设计模式之保护性暂停

设计模式之保护性暂停 Guarded Suspension&#xff0c;这个设计模式&#xff0c;主要用在一个线程等待另一个线程的执行结果&#xff08;发请求等待响应&#xff09; 有一个结果需要从一个线程传递到另一个线程&#xff0c;传递只进行一次&#xff0c;用设计模式保护性暂停。 …

46 WAF绕过-信息收集之反爬虫延时代理池技术

目录 简要本章具体内容和安排缘由简要本课具体内容和讲课思路简要本课简要知识点和具体说明演示案例:Safedog-默认拦截机制分析绕过-未开CCSafedog-默认拦截机制分析绕过-开启CC总结&#xff1a; Aliyun_os-默认拦截机制分析绕过-简要界面BT(防火墙插件)-默认拦截机制分析绕过-…

小米汽车的占用网络是什么

大家好啊&#xff0c;我是董董灿。 昨天小米汽车开了发布会&#xff0c;一下子喜提十几个热搜。 就在人们纷纷猜测&#xff0c;小米汽车的定价会不会延续小米极致性价比风格时。 雷总的一句"电池成本都不下于十几万"&#xff0c;瞬间把人们对于小米汽车定价的幻想拉…

CMake入门教程【核心篇】静态库 (.a, .lib)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 概述创建静态库添加静态库到你的项目完整代码示例实战使用技巧与注意事项总结与分析概述 静态库在C++开发中扮演着重要的角色。它们通常以.a(在Unix-like系统

新手练习项目 4:简易2048游戏的实现(C++)

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#xff09; 目录 一、效果图二、代码&#xff08;带注释&#xff09;三、说明 一、效果图 二、代码&#xff08;带…

MYSQL篇--索引高频面试题

mysql索引 1什么是索引&#xff1f; 索引说白了就是一种数据结构&#xff0c;可以协助快速查询数据&#xff0c;以及更新数据库表中的数据&#xff0c;更通俗的来说索引其实就是目录&#xff0c;通过对数据建立索引形成目录&#xff0c;便于去查询数据&#xff0c;而mysql索引…

静态网页设计——旅游景点介绍(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1f64y1N7uH/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

虚拟机VMware安装Linux

关于安装&#xff0c;安装版本是CentOS 7&#xff0c;选择最小安装即可 第一步&#xff1a;选择创建新的虚拟机 第二步&#xff1a;默认典型&#xff0c;点击下一步 第三步&#xff1a;选择稍后安装操作系统 第四步&#xff1a;选择Linux和版本 第五步&#xff1a;输入虚拟机名…