回溯详解 LeetCode 46. 全排列 51. N 皇后 52. N皇后 II

news2024/11/24 7:27:23

🌈🌈😄😄

欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 46. 全排列 51. N 皇后 52. N皇后 II,做好准备了么,那么开始吧。

🌲🌲🐴🐴

46. 全排列

一、力扣示例

二、解决办法

三、代码实现

51. N 皇后

一、力扣示例

二、解决办法

三、代码实现

52. N皇后 II

一、力扣示例

二、解决办法

三、代码实现


其实回溯算法和我们常说的 DFS 算法非常类似,本质上就是一种暴力穷举算法。回溯算法和 DFS 算法的细微差别是:回溯算法是在遍历「树枝」,DFS 算法是在遍历「节点」

回溯算法的这段核心框架

解决一个回溯问题,实际上就是一个决策树的遍历过程,站在回溯树的一个节点上,你只需要思考 3 个问题:

1、路径:也就是已经做出的选择。

2、选择列表:也就是你当前可以做的选择。

3、结束条件:也就是到达决策树底层,无法再做选择的条件。

下面用几道例题演示一下

46. 全排列

一、力扣示例

46. 全排列 - 力扣(LeetCode)https://leetcode.cn/problems/permutations/

二、解决办法

回溯

[2] 就是「路径」,记录你已经做过的选择;[1,3] 就是「选择列表」,表示你当前可以做出的选择;「结束条件」就是遍历到树的底层叶子节点,这里也就是选择列表为空的时候

运用回溯框架,即可解决此题。

三、代码实现

class Solution {
    List<List<Integer>> res = new LinkedList<>();

    /* 主函数,输入一组不重复的数字,返回它们的全排列 */
    List<List<Integer>> permute(int[] nums) {
        // 记录「路径」
        LinkedList<Integer> track = new LinkedList<>();
        // 「路径」中的元素会被标记为 true,避免重复使用
        //初始化路径为false,当路径被标记设为true
        boolean[] used = new boolean[nums.length];
        
        backtrack(nums, track, used);
        return res;
    }

// 路径:记录在 track 中
// 选择列表:nums 中不存在于 track 的那些元素(used[i] 为 false)
// 结束条件:nums 中的元素全都在 track 中出现
    void backtrack(int[] nums, LinkedList<Integer> track, boolean[] used) {
    // 触发结束条件
        if (track.size() == nums.length) {
            res.add(new LinkedList(track));
            return;
    }
    
        for (int i = 0; i < nums.length; i++) {
            // 排除不合法的选择
            if (used[i]) {
                // nums[i] 已经在 track 中,跳过
                continue;
            }
            // 做选择
            track.add(nums[i]);
            used[i] = true;
            // 进入下一层决策树
            backtrack(nums, track, used);
            // 取消选择
            track.removeLast();
            used[i] = false;
        }
    }

}

51. N 皇后

一、力扣示例
 

51. N 皇后 - 力扣(LeetCode)https://leetcode.cn/problems/n-queens/

二、解决办法

回溯

找寻

1、路径:也就是已经做出的选择。

2、选择列表:也就是你当前可以做的选择。

3、结束条件:也就是到达决策树底层,无法再做选择的条件。

运用回溯框架,求解此题

 

 

 

三、代码实现

class Solution {
    List<List<String>> res=new LinkedList<>();
    public List<List<String>> solveNQueens(int n) {
        
        char [][]board=new char [n][n];
        for(int i=0;i<n;i++){
            Arrays.fill(board[i],'.');//将二维字符数组每位数赋值为字符'.'
        }        
        backtrack(board,n,0);//调用函数求每个满足的排法
        return res;
    }
    void backtrack(char [][]board,int n,int row){
        //结束条件
        if(row==n){
            LinkedList<String> r = new LinkedList<>();
            for(int i = 0;i<n;i++){
                r.add(new String(board[i]));//将字符数组转变成字符串
            }
                res.add(new LinkedList<>(r));
                return;
        }


        for(int col=0;col<n;col++){
            //排除不合法选择
            if(!valid(board,row,col)){
                continue;
        }
        //做选择
        board[row][col]='Q';
        //决策
        backtrack(board,n,row+1);
        //撤销选择
        board[row][col]='.';           

        }
                        
    }

    boolean valid(char [][]board,int row,int col){

        int n = board.length;
        // 检查列是否有皇后互相冲突
        for (int i = 0; i <= row; i++) {
            if (board[i][col] == 'Q')
                return false;
        }
        // 检查右上方是否有皇后互相冲突
        for (int i = row - 1, j = col + 1; 
                i >= 0 && j < n; i--, j++) {
            if (board[i][j] == 'Q')
                return false;
        }
        // 检查左上方是否有皇后互相冲突
        for (int i = row - 1, j = col - 1;
                i >= 0 && j >= 0; i--, j--) {
            if (board[i][j] == 'Q')
                return false;
        }
        return true;
    }
}

 

 52. N皇后 II

一、力扣示例

52. N皇后 II - 力扣(LeetCode)https://leetcode.cn/problems/n-queens-ii/

二、解决办法

回溯

此解和N皇后类似,只是不需要将解求出来,而是计算解的个数。

三、代码实现

class Solution {
    int count;
    public int totalNQueens(int n) {
        
        char [][]board=new char [n][n];
        for(int i=0;i<n;i++){
            Arrays.fill(board[i],'.');
        }
        backtrack(board, 0);
        return count;
    }

    void backtrack(char [][]board,int row){

        if(board.length==row){
            count++;
            return;
        }
        int n = board[row].length;
        for(int col=0;col<n;col++){
            
            if(!valid(board,row,col)){
                continue;
            }
            board[row][col]='Q';

            backtrack(board,row+1);

            board[row][col]='.';

        }
    }
    
    boolean valid(char [][]board,int row,int col){

        int n = board.length;
        // 检查列是否有皇后互相冲突
        for (int i = 0; i <= row; i++) {
            if (board[i][col] == 'Q')
                return false;
        }
        // 检查右上方是否有皇后互相冲突
        for (int i = row - 1, j = col + 1; 
                i >= 0 && j < n; i--, j++) {
            if (board[i][j] == 'Q')
                return false;
        }
        // 检查左上方是否有皇后互相冲突
        for (int i = row - 1, j = col - 1;
                i >= 0 && j >= 0; i--, j--) {
            if (board[i][j] == 'Q')
                return false;
        }
        return true;
    }
}

 

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

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

相关文章

Word处理控件Aspose.Words功能演示:如何在 C# 和Java中将 DOC 转换为 JSON

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

kvm磁盘管理

kvm磁盘管理虚拟磁盘类型rawqcow2qemu-img常用参数主要参数&#xff1a;查看磁盘信息--info创建磁盘文件--create磁盘容量调整--resize磁盘增加容量磁盘缩小容量(生产环境下禁止操作)磁盘调整容量到指定大小转换磁盘格式--convert检查磁盘镜像在线热添加磁盘附加磁盘到vm实例--…

UI自动化测试面试题总结

文章目录一、请描述实现用户登陆模拟自动化测试的思路。二、基于Web端呈现的产品如何做自动化测试&#xff0c;谈谈你的思路和方向。三、什么是web自动化测试&#xff1f;四、什么是selenium&#xff1f;五、写出selenium中你最熟悉的接口或类(*)六、findElement()和findElemen…

java总结(数组)

1.数组概述数组&#xff08;Array&#xff09;是多个相同数据类型按照一定顺序排列的集合&#xff0c;并使用一个名字命名&#xff0c;通过编号的方式对这些数据进行统一的管理。数组相关概念数组名&#xff1a;下标&#xff08;索引&#xff09;元素数组长度数组特点有序排列数…

sqlserver将mdf文件拆分成多个ndf文件

sqlserver版本&#xff1a;2008R2 1、为什么要拆分 数据库在运行一段时间后mdf文件会迅速增大&#xff0c;这会导致查询速度变慢。或者mdf文件的大小达到了操作系统允许的最大大小&#xff0c;这个时间就必须要进行拆分了。 2、拆分的好处 在没有拆分的时候只有一个mdf主数…

KVM虚拟化技术学习笔记10

虚拟机镜像管理 学习目标&#xff1a; 能够了解KVM虚拟机支持的镜像格式 能够使用qemu-img实现镜像创建 能够使用qemu-img实现镜像查看 能够使用qemu-img实现镜像格式转换 能够了解后备镜像的作用 能够了解差量镜像的作用 能够基于后备镜像制作差量镜像 能够使用差量镜…

SAP ADM100-2.3 系统启动:AS ABAP和AS ABAP+JAVA

一、打开并停止一个SAP Netweaver AS ABAP+JAVA 使用例如SAP MC(SAP Management Console)工具开启并关闭实例。在一个双栈实例中(ABAP+JAVA),JAVA是通过ABAP dispatcher使用Startup and Control Framework开启的,然后它再开启JAVA dispatcher和SP(server Processes)。 …

Qt OpenGL(三十)——Qt OpenGL 核心模式-纹理二(给正方体贴上图片)

提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十)——Qt OpenGL 核心模式-纹理二(给正方体贴上图片) 通过前两篇文章,我们知道了如何绘制一个正六面体和使用纹理贴图,本篇继续介绍在正方体(正…

面试中如何才能有底气的回答,软件测试题库你有必要一用

面试&#xff0c;是决定求职者是否能进入到自己心仪岗位的敲门砖&#xff0c;而对于很多第一次参加软件测试面试的求职来说&#xff0c;想要通过面试就得经过hr的初面以及技术官技术面&#xff0c;前者还好说&#xff0c;可以根据情况临场发挥&#xff0c;而后者&#xff0c;就…

Linux 之十七 Ubuntu 22.04 配置内核版本、GRUB 引导、远程桌面

前段时间重新安装了 Ubuntu 22.04 LTS&#xff0c;安装后没有显示 GRUB 引导页面&#xff08;默认自动跳过&#xff09;&#xff0c;直接使用默认内核启动&#xff0c;而我需要变更一下默认的内核版本&#xff0c;特此记录一下修改过程。 安装其他版本内核 Ubuntu 中安装其他版…

MAC m1 安装 allure

一、下载安装包&#xff0c;并进行解压 1.1 下载安装包 官网下载包地址 1.2 双击 进行 解压 二、配置环境变量 2.1 打开配置文件 在终端输入以下命令 vi ~/.bash_profile【注意】 该命令地址 注意 中间不要出现多余的空格&#xff0c;否则打开会有问题&#xff0c;这个…

学生护眼台灯怎么选?推荐教育部认可护眼灯品牌

现在许多家庭都会购买学生护眼台灯给孩子用&#xff0c;那么学生护眼台灯怎么选&#xff1f;1. 光线的舒适度&#xff0c;才是最关键的&#xff1a;一般会在护眼技术上体现出&#xff0c;有全光谱灯珠、色温舒适、显色指数高、无蓝光危害、无可视频闪等&#xff0c;让光线照射眼…

高效、优雅的对象copy之MapStruct入门到精通,实战踩坑版

一、前言 大家在开发中&#xff0c;最让人头疼的就是&#xff1a;对象之间的拷贝&#xff0c;前端的VO和数据库的Entity不一致&#xff01; 性能最好的就是手动set&#xff0c;主要是枯燥且无技术含量&#xff0c;不仅耗费大量时间而且很容易出错&#xff1b; 所以我们要成为…

jsp 新房销售竞买管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 新房销售竞买管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用web模式开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

OJ万题详解––赦免战俘(C++详解)

题目 题目背景 借助反作弊系统&#xff0c;一些在月赛有抄袭作弊行为的选手被抓出来了&#xff01; 题目描述 现有 名作弊者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定赦免一些作弊者。他将正方形矩阵均分为 4 个更小的正方形矩阵&#xff0c;每个更小的矩阵的边长…

VSCode调试Python文件并指定虚拟环境 附调试说明

记录在使用VSCode调试py文件时遇到的一些问题&#xff1a;1.启用Debug模式进行调试2.调试带参数的python文件3. 调试时指定服务器虚拟环境4. 相对路径出错5 continue&#xff08;继续&#xff09;、step over&#xff08;单步跳过&#xff09;、step in&#xff08;单步调试&am…

【Python学习笔记】2. Python3 环境搭建

前言 将向大家介绍如何在本地搭建 Python3 开发环境。 Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Python3 环境搭建 本节我们将向大家介绍如何在本地搭建 Python3 开发环境。 Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Unix (Solaris, Li…

我理解的测试开发与实践总结——新人篇

我理解的测试开发与实践总结——新人篇 目录导读 一、我理解的测试开发 二、测试和开发、产品的关系 三、测试开发需要具备的技能 四、我们在测试过程中需要做到什么程度 五、我们需要具备的素质 六、测试工作流程及关注点有哪些 七、平时常用的一些小工具和测试技巧 写…

windows下编译mingw版本的glew库

glew下载 https://glew.sourceforge.net/index.html windows二进制版下来是MSVC版的库文件&#xff0c;.lib文件。而gcc并不能使用&#xff0c;需要重新进行编译。 下载源码版的glew文件&#xff0c;解压&#xff0c;进入到源码目录&#xff0c;打开cmd 第一步&#xff1a;编译…

【OpenCV】 模版匹配 | 霍夫变换 | 霍夫线、圆检测

Ⅰ. 模版匹配和霍夫变换 0x00 模板匹配 原理 所谓的模板匹配&#xff0c;就是在给定的图片中查找和模板最相似的区域&#xff0c;该算法的输入包括模板和图片&#xff0c;整个任务的思路就是按照滑窗的思路不断的移动模板图片&#xff0c;计算其与图像中对应区域的匹配度&…