算法训练营Day27

#Java #回溯 #Hard

开源学习资料

Feeling and experiences:

以下题目都比较困难,第一遍刷的时候,先看懂即可。

重新安排行程:力扣题目链接

给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。

所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。

  • 例如,行程 ["JFK", "LGA"]["JFK", "LGB"] 相比就更小,排序更靠前。

假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。

class Solution {Map<String, PriorityQueue<String>> map = new HashMap<String, PriorityQueue<String>>();List<String> itinerary = new LinkedList<String>();public List<String> findItinerary(List<List<String>> tickets) {for (List<String> ticket : tickets) {String src = ticket.get(0), dst = ticket.get(1);if (!map.containsKey(src)) {map.put(src, new PriorityQueue<String>());}map.get(src).offer(dst);}dfs("JFK");Collections.reverse(itinerary);return itinerary;}public void dfs(String curr) {while (map.containsKey(curr) && map.get(curr).size() > 0) {String tmp = map.get(curr).poll();dfs(tmp);}itinerary.add(curr);}
}

1. 问题理解:
• 目标是根据给定的航班列表,找到一条从”JFK”出发,覆盖所有航班至少一次的行程。
• 如果存在多种可能的行程,选择字典序最小的那一条。


2. 关键概念:
• 涉及到类似于欧拉路径的概念,即通过图中的所有边恰好一次的路径。


3. 数据结构选择:
• 使用哈希表(Map<String, PriorityQueue<String>> map)来存储从每个机场出发的航班。键是出发机场,值是一个优先级队列,包含按字典序排列的目的地机场。
• 使用链表(List<String> itinerary)来存储最终的行程。


4. 算法流程:
• 构建图:遍历每张机票,构建出发地到目的地的映射,存入哈希表。
• 深度优先搜索(DFS):从”JFK”开始进行DFS,按字典序探索每个机场的所有目的地。
• 递归终止条件:当一个机场没有更多可飞往的目的地时,将其加入行程。
• 行程构建:由于DFS是先达到最深层再回溯,所以最终的行程是逆序的,需要反转链表得到正确顺序。


5. 特殊情况处理:
• 当存在多条路径时,优先级队列确保按字典序选择路径。
• 由于题目中的图可能不是传统意义上的欧拉图(可能不包含所有边),算法的目标是覆盖所有给定的边。

N皇后:力扣题目链接

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

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

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

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

class Solution {public List<List<String>> solveNQueens(int n) {List<List<String>> solutions = new ArrayList<List<String>>();int[] queens = new int[n];Arrays.fill(queens, -1);Set<Integer> columns = new HashSet<Integer>();Set<Integer> diagonals1 = new HashSet<Integer>();Set<Integer> diagonals2 = new HashSet<Integer>();backtrack(solutions, queens, n, 0, columns, diagonals1, diagonals2);return solutions;}public void backtrack(List<List<String>> solutions, int[] queens, int n, int row, Set<Integer> columns, Set<Integer> diagonals1, Set<Integer> diagonals2) {if (row == n) {List<String> board = generateBoard(queens, n);solutions.add(board);} else {for (int i = 0; i < n; i++) {if (columns.contains(i)) {continue;}int diagonal1 = row - i;if (diagonals1.contains(diagonal1)) {continue;}int diagonal2 = row + i;if (diagonals2.contains(diagonal2)) {continue;}queens[row] = i;columns.add(i);diagonals1.add(diagonal1);diagonals2.add(diagonal2);backtrack(solutions, queens, n, row + 1, columns, diagonals1, diagonals2);queens[row] = -1;columns.remove(i);diagonals1.remove(diagonal1);diagonals2.remove(diagonal2);}}}public List<String> generateBoard(int[] queens, int n) {List<String> board = new ArrayList<String>();for (int i = 0; i < n; i++) {char[] row = new char[n];Arrays.fill(row, '.');row[queens[i]] = 'Q';board.add(new String(row));}return board;}
}

1. 问题定义:
• 在一个N×N的棋盘上放置N个皇后,使得它们互不攻击。


2. 关键数据结构:
• int[] queens:存储每一行皇后的列位置。
• Set<Integer> columns, diagonals1, diagonals2:分别记录已经放置皇后的列和两组斜线,以检测冲突。


3. 算法流程:
• 初始化:创建解集solutions,初始化queens数组和三个用于检测冲突的集合。
• 回溯搜索 (backtrack 方法):
• 如果已经处理完所有行,生成棋盘并添加到解集中。
• 在当前行,遍历所有列:
• 检查当前列和两个斜线方向是否已经有皇后(冲突检测)。
• 如果无冲突,放置皇后并更新冲突检测集合。
• 递归处理下一行。
• 回溯:撤销当前行皇后的放置,恢复冲突检测集合,尝试下一个位置。


4. 生成棋盘 (generateBoard 方法):
• 根据每行皇后的位置,生成代表棋盘的字符串列表。

以上代码均为力扣答案~

谁家今夜扁舟子?

何处相思明月楼?

Fighting!
 

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

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

相关文章

计算 10亿 的和,js 和 c 的处理时长对比

计算 10亿 的和&#xff0c;js 和 c 的处理时长对比 js 4.17s let sum 0; let start new Date().getTime(); for (let i0;i<1000000000; ii1){sum sum i; } let stop new Date().getTime(); console.log((stop - start)/1000, sum);结果&#xff1a; c 3.65s #in…

Windows搭建FTP服务器教学以及计算机端口介绍

目录 一. FTP服务器介绍 FTP服务器是什么意思&#xff1f; 二.Windows Service 2012 搭建FTP服务器 1.开启防火墙 2.创建组 ​编辑3.创建用户 4.用户绑定组 5.安装ftp服务器 ​编辑6.配置ftp服务器 7.配置ftp文件夹的权限 8.连接测试 三.计算机端口介绍 什么是网络…

【优质会议|录用快】2024年教育发展与多媒体技术国际会议(ICEDUTM 2024)

【优质会议|录用快】2024年教育发展与多媒体技术国际会议&#xff08;ICEDUTM 2024&#xff09; 2024 International Conference on Education Development and Multimedia Technology 会议的主题主要围绕教育发展和多媒体技术的研究领域&#xff0c;旨在为相关领域的专家、学…

解决ELement-UI懒加载三级联动数据不回显(天坑)

最老是遇到这类问题头有点大,最后也是解决了,为铁铁们总结了一下几点 一.查看数据类型是否一致 未选择下 选择下 二.处理数据时使用this.$set方法来动态地设置实例中的属性&#xff0c;以确保其响应式 三.绑定v-if 确保每次重新加载 四.绑定key 五.完整代码

进行VMware日志管理

随着公司转向虚拟化其 IT 空间&#xff0c;虚拟环境日志监控正在占据日志管理的很大一部分,除了确保网络安全外&#xff0c;虚拟机日志监控还有助于管理虚拟化工具&#xff0c;这是最复杂的任务之一。 对虚拟环境日志的监控分析 当今公司中最受欢迎的虚拟平台之一是 VMware。…

图像处理-周期噪声

周期噪声 对于具有周期性的噪声被称为周期噪声&#xff0c;其中周期噪声在频率域会出现关于中心对称的性质&#xff0c;如下图所示 带阻滤波器 为了消除周期性噪声&#xff0c;由此设计了几种常见的滤波器&#xff0c;其中 W W W表示带阻滤波器的带宽 理想带阻滤波器 H ( u …

二维码能转成链接吗?具体步骤是什么样的?

将二维码分解成链接来使用&#xff0c;是经常会出现的一种需求&#xff0c;分解成的链接可以放在电脑浏览器上&#xff0c;就可以在电脑上查看二维码的内容。那么如何将二维码图片做解码处理呢&#xff1f;最简单也是很多人会选择使用的一种方法就是使用二维码解码器来处理&…

客户案例:网关V7助力政府行业提升邮件安全与效率

客户背景 某事业单位自1983年创立以来&#xff0c;始终以应用为导向&#xff0c;坚定地推进机制创新与实际创新双轨并进。在区域教育信息化领域&#xff0c;该单位从广度与深度两个维度进行了大力推进&#xff0c;取得了许多具有独创性的成果。通过充分利用现代教育技术&#…

如何提高代码质量:5 个基本步骤

软件开发团队有时会遇到各种挑战&#xff0c;导致他们难以按时生产高质量的项目。在这里&#xff0c;我们讨论了通过持续测试快速保证质量的五种策略。 每个人都想要更高质量、更快的软件。对现代软件开发团队的要求是巨大的——从日益激烈的竞争和市场压力、不断增加的功能和…

php-ssrf

漏洞描述&#xff1a; SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求…

POI根据表头模板导出excel数据,并指定单个单元格样式,多sheet。

最近的公司需求&#xff0c;因为Excel表头样式较为复杂&#xff0c;不易直接用poi写出。 需要的Excel为这种&#xff1a; 直接模板导出不能成为这样。 public void exportCheckCsdn(HttpServletResponse response) {//获取到MNR 和 MNR-DT 的List// 此处写 获取到指定li…

是德科技E9304A功率传感器

是德科技E9304A二极管功率传感器测量频率范围为9 kHz至6 GHz的平均功率&#xff0c;功率范围为-60至20 dBm。该传感器非常适合甚低频(VLF)功率测量。E系列E9304A功率传感器有两个独立的测量路径&#xff0c;设计用于EPM系列功率计。功率计自动选择合适的功率电平路径。为了避免…

【面试题】写一个睡眠函数

题目要求 请你编写一个异步函数&#xff0c;它接收一个正整数参数 millis &#xff0c;并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1&#xff1a; 输入&#xff1a;millis 100 输出&#xff1a;100 解释&#xff1a; 在 100ms 后此异步函数执行完时返回一个 Pro…

【微信小程序二维码配置】微信公众平台配置二维码,小程序测试二维码,小程序动态二维码,然后扫码打开对应页面进行操作

微信小程序二维码 操作添加二维码地址配置配置项 生成二维码动态二维码生成 操作 微信公众平台地址&#xff1a;微信公众平台 选择 开发管理 – 开发设置 – 扫普通链接二维码打开小程序 添加二维码地址 配置 配置项 二维码规则: URL 为内含下载校验文件的服务器 URL, 可以…

HTML-基础知识-基本结构,注释,文档说明,字符编码(一)

1.超文本标记语言不分大小写。 2.超文本标签属性名和属性值不区分大小写。 3.超文本标签属性值重复&#xff0c;听取第一个。 4.html结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"vi…

BCELoss,BCEWithLogitsLoss和CrossEntropyLoss

目录 二分类 1. BCELoss 2. BCEWithLogitsLoss 多分类 1. CrossEntropyLoss 举例 二分类 两个损失&#xff1a;BCELoss&#xff0c;BCEWithLogitsLoss 1. BCELoss 输入&#xff1a;&#xff08;[B,C], [B,C]&#xff09;,代表&#xff08;prediction,target&#xff09…

uniapp项目如何引用安卓原生aar插件(避坑指南三)

官方文档说明&#xff1a;uni小程序SDK 【彩带- 避坑知识点】 如果引用原生aar插件&#xff0c;都配置好之后&#xff0c;云打包&#xff0c;报不包含此插件&#xff0c;除了检查以下步骤流程外&#xff0c;还要检查一下是否上打包的原生插件aar流程有问题。 1.第一步在uniapp项…

关于“Python”的核心知识点整理大全44

目录 ​编辑 15.3.4 模拟多次随机漫步 rw_visual.py 注意 15.3.5 设置随机漫步图的样式 15.3.6 给点着色 rw_visual.py 15.3.7 重新绘制起点和终点 rw_visual.py 15.3.8 隐藏坐标轴 rw_visual.py 15.3.9 增加点数 rw_visual.py 15.3.10 调整尺寸以适合屏幕 rw_vi…

Linux磁盘与文件管理

目录 一、磁盘介绍 1. 磁盘数据结构 2. 磁盘的接口类型 3. 磁盘在Linux上的表现形式 二、磁盘分区与MBR 1. 分区优缺点 2. 分区方式 3. MBR分区 4. GPT分区 三、文件系统 1. 文件系统的组成 2. 默认的文件系统 3. 文件系统的作用 4. 模拟破坏文件与修复文件 4…

C语言二维数值数组常用算法------------(C每日一编程)

--主、次对角线求和 --上、下三角求和 --N*N方阵转置 --杨辉三角 正文开始&#xff1a; 主对角线&#xff1a; 用两个双重for循环 int a[3][3], i, j, s 0; for (i 0; i < 3; i)for (j 0; j < 3; j)if (i j)s s a[i][j]; 次对角线&#xff1a; 用两个双重…