【LeetCode】回溯

labuladong回溯
回溯算法秒杀所有排列-组合-子集问题

回溯

一个回溯问题,实际上就是遍历一棵决策树的过程,树的每个叶子节点存放着一个合法答案。你把整棵树遍历一遍,把叶子节点上的答案都收集起来,就能得到所有的合法答案。
站在回溯树的一个节点上,你只需要思考 3 个问题:
1、路径:也就是已经做出的选择。
2、选择列表:也就是你当前可以做的选择。
主要就是在选择前先把不能选的排除调,比如全排列是要排除掉已经选了的数字,n皇后是要把当前列,左上角斜线和右上角斜线 有皇后的排除掉。
3、结束条件:也就是到达决策树底层,无法再做选择的条件。
这里add到res的时候要new 一个新的list

模板

写 backtrack 函数时,需要维护走过的「路径」和当前可以做的「选择列表」,当触发「结束条件」时,将「路径」记入结果集。

回溯就是核心就是 for 循环里面的递归,在递归调用之前「做选择」,在递归调用之后「撤销选择」.

result = []
def backtrack(路径, 选择列表):if 满足结束条件:result.add(路径)returnfor 选择 in 选择列表:1. 排除不合法选择2. 做选择3. backtrack(路径, 选择列表)4. 撤销选择

例题

46.全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1]
输出:[[1]]
提示:

1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同


选择列表其实就是 nums除去已经选过的数,所以我们可以用int[] used 记录被选的数
在这里插入图片描述

class Solution {List<List<Integer>> res = new LinkedList<>();public List<List<Integer>> permute(int[] nums) {LinkedList<Integer> track = new LinkedList<>();// 初始值都是falseboolean[] used = new boolean[nums.length];backtrack(nums, track, used);return res;}private 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]){continue;}// 做出选择track.add(nums[i]);used[i] = true;// 下一层决策树backtrack(nums, track, used);// 撤回选择track.removeLast();used[i] = false;}}
}

51. n皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
输入:n = 4
输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:

输入:n = 1
输出:[[“Q”]]


这道题其实就是遍历棋盘上的每一行,当所有行都遍历完了 就是放遍历到的路径的时候。
做选择的时候要把当前位置不能放皇后的排除掉,排除的方法就是看当前列,左上角斜线,右上角斜线有没有皇后。

class Solution {List<List<String>> res = new LinkedList<>();public List<List<String>> solveNQueens(int n) {// 初始化棋盘List<String> board = new LinkedList<>();for (int i=0;i<n;i++){StringBuilder sb = new StringBuilder();for (int j=0;j<n;j++){sb.append(".");}board.add(sb.toString());}backtrack(board, 0);return res;}// 一行的选择其实就是 决策树的一层private void backtrack(List<String> board, int row){// 结束条件 最后一行遍历完是board.size()-1,最后一行的下一行就应该结束了if (board.size()==row){res.add(new LinkedList(board));return ;}int n = board.get(row).length();for (int col=0;col<n;col++){// 排除不合法选择if (!isValid(board, row, col)){continue;}// 做出选择:也就是把皇后Q放到当前colStringBuilder sb = new StringBuilder(board.get(row));sb.setCharAt(col, 'Q');board.set(row, sb.toString());// 去遍历下一层backtrack(board, row+1);// 撤销选择sb.setCharAt(col, '.');board.set(row, sb.toString());}}private boolean isValid(List<String> board, int row, int col){int n = board.size();// 看每一行的当前列 是否有皇后for (int i = 0; i < n; i++) {if (board.get(i).charAt(col)=='Q'){return false;}}// 看左上方 斜线是否有皇后for (int i=row-1,j=col-1;i>=0&& j>=0;i--,j--){if (board.get(i).charAt(j)=='Q'){return false;}}/* 检查右上方是否有皇后互相冲突 */for (int i = row - 1, j = col + 1;i >= 0 && j < n; i--, j++) {if (board.get(i).charAt(j) == 'Q') {return false;}}return true;}
}

52. n皇后 ②

n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。


和51其实一样,只是存结果的时候不用存了,只用加数量即可

	int res = 0;private void backtrack(List<String> board, int row){// 结束条件 最后一行遍历完是board.size()-1,最后一行的下一行就应该结束了if (board.size()==row){res++;return ;}

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

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

相关文章

CCF-CSP认证考试 202305-3 解压缩 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202305-3 解压缩 时间限制&#xff1a; 5.0s 内存限制&#xff1a; 512.0MB 题目背景 西西艾弗岛运营公司是一家负责维护和运营岛上基础设施的大型企业。在公司内&#xff0c;…

SCI论文发表很容易【8】:成为一名学者之路--以经济为方向

【1】Starting Your Career(开启职业生涯) 1. An Old Male Economists Advice to Young Female Economists," Dan Hamermesh, CSWEP Newsletter, Winter 2005. 2."The Young Economists Guide to Professional Etiquette," Daniel S. Hamermesh, Journal of…

上海晋名室外暂存柜助力新技术皮革制品生产行业安全

本周上海晋名又有一台室外危化品暂存柜项目通过验收&#xff0c;此次项目主要用于新技术皮革制品生产行业油桶、化学品等物资的室外暂存安全。 用户单位创立于2004年&#xff0c;是一家从事新技术皮革制品加工、生产的外资企业。 上海晋名作为一家专注工业安全防护领域&#…

python中医学习服务管理系统flask-django-php-nodejs

随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的中医学习服务管理系统。当前的信息管理存在工作…

面向对象的三大特性-----封装、继承、多态(Java篇)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支持一…

ngrok实现内网穿透

在使用jenkins进行自动化部署时&#xff0c;需要设置github的webhook钩子来触发构建&#xff0c;由于jenkins运行在自己的电脑上&#xff0c;因此需要通过内网穿透来接受http请求。 Install ngrok via Homebrew with the following command: brew install ngrok/ngrok/ngrokP…

五、大模型-Prompt

一、prompt是什么 在大型语言模型集成中&#xff0c;"prompt" 是指您向模型提供的输入文本或指令&#xff0c;以引导模型生成特定类型的响应。这个 prompt 可以是一个问题、一段描述、一个任务说明&#xff0c;甚至是一部分对话历史记录等。通过设计和优化 prompt&a…

Linux基础命令[20]-useradd

文章目录 1. useradd 命令说明2. useradd 命令语法3. useradd 命令示例3.1 不加参数3.2 -d&#xff08;指定家目录&#xff09;3.3 -g&#xff08;指定用户组&#xff09;3.4 -G&#xff08;指定附属组&#xff09;3.5 -p&#xff08;加密密码&#xff09;3.6 -e&#xff08;指…

【WEEK4】 【DAY3】整合SSM框架之功能实现—修改、删除数据【中文版】

2024.3.20 Wednesday 接上文【WEEK4】 【DAY2】整合SSM框架之功能实现—总览、添加数据【中文版】 目录 7.6.修改功能7.6.1.修改BookController.java7.6.2.修改allBook.jsp7.6.3.新建updateBook.jsp7.6.4.修改MyBatis-config.xml7.6.5.运行 7.7.删除功能7.7.1.修改BookContro…

【数据库系统】数据库完整性和安全性

第六章 数据库完整性和安全性 基本内容 安全性&#xff1b;完整性&#xff1b;数据库恢复技术&#xff1b;SQL Server的数据恢复机制&#xff1b; 完整性 实体完整性、参照完整性、用户自定义完整性 安全性 身份验证权限控制事务日志&#xff0c;审计数据加密 数据库恢复 冗余…

使用python正则表达式提取RG4

lin_20240204_extract_rg4.py 1.使用正则表达式从utr&#xff0c;cds区域提取rG4&#xff0c;输出结果包括序列名称&#xff0c;序列内容&#xff0c;初始位置&#xff0c;终止位置&#xff0c;序列类型&#xff1b; 2.生成的文件&#xff0c;用于下一步计算g4score:lin_202403…

ABAP 编程中 JASON 字符中 % 百分号如何处理?

在ABAP编程中 JSON 字符串报错&#xff1a; parse error: Unrecognized character escape % (code 37)\n 这个错误提示表明在尝试解析的JSON字符串中有一个不被识别的转义字符 %。在JSON中&#xff0c;只有以下字符可以被转义&#xff1a; \ " / b f n r t u 四位十六进…

关于Windows 10 LTSC 2019无法安装Edge的解决方案

最近新换了Windows 10 LTSC 2019系统&#xff0c;使用体验干净且流畅&#xff0c;但是在更新Edge时遇到了问题&#xff1a;系统内装的是9x版本的Edge浏览器&#xff0c;并且提示更新错误&#xff0c;有system level方面的问题&#xff0c;查询多方后&#xff0c;最终在Microsof…

JavaWeb:AOP、配置优先级、Bean管理、SpringBoot原理、Maven高级

1 AOP 1.1 基本语法 面向切面编程、面向方面编程&#xff0c;面向特定方法编程 在管理bean对象的过程中&#xff0c;主要通过底层的动态代理机制&#xff0c;对特定的方法进行编程 应用&#xff1a;统计每一个业务方法的执行耗时 xml引入依赖 <!-- AOP-->&l…

音视频开发_FFmpeg基石精讲

FFmpeg 框架 核心组件 libavcodec&#xff1a;一个编解码库&#xff0c;包含了众多的编码器和解码器用于编码和解码音视频流。libavformat&#xff1a;一个封装格式库&#xff0c;用于处理各种音视频封装格式。libavutil&#xff1a;一个工具库&#xff0c;提供了常见功能的简…

牛客周赛 Round 37 E.魔法之森的蘑菇

广搜板子&#xff0c;加个方向就好了 注意多测清空问题 #include<bits/stdc.h> using namespace std; using ll long long; #define int long long const int N 1e510; const int inf 0x3f3f3f3f; const int mod 1e97;int n,m; char g[1010][1010]; bool vis[1010][1…

CI/CD实战-jenkins部署 3

安装 软件下载地址&#xff1a;Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 启动服务 安装推荐插件 不新建用户&#xff0c;使用admin账号登录 修改一下初始密码 新建项目测试 安装git命令 生成密钥 在gitlab中上传公钥 修改ssh 创建中…

智能缺陷检测系统在食品行业的应用与前景

智能缺陷检测系统在食品行业的应用日益广泛&#xff0c;其前景也呈现出积极的态势。以下是关于该系统在食品行业的应用及前景的详细分析&#xff1a; 一、智能缺陷检测系统在食品行业的应用 在食品行业的生产过程中&#xff0c;智能缺陷检测系统发挥着至关重要的作用。它可以…

蓝桥杯(3.22 刷真题)

P8682 [蓝桥杯 2019 省 B] 等差数列 RE是因为除以0的情况 import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[] res new int[n1];for(int i1;i&l…

城管智慧执法系统源码有演示,自主研发,功能完善,正版授权,可商用上项目。

城管智慧执法系统源码有演示&#xff0c;自主研发&#xff0c;功能完善&#xff0c;正版授权&#xff0c;可商用上项目。 一套数字化的城管综合执法办案系统源码&#xff0c;提供了案件在线办理、当事人信用管理、文书电子送达、沿街店铺视频智能分析等功能&#xff0c;全面赋能…