【随想录】Day30—第七章 回溯算法part06

目录

  • 题目1: 重新安排行程
    • 1- 思路
    • 2- 题解
      • ⭐重新安排行程 ——题解思路
  • 题目2: N皇后
    • 1- 思路
    • 2- 题解
      • ⭐N皇后 ——题解思路
  • 题目3: 解数独(跳过)


题目1: 重新安排行程

  • 题目链接:332. 重新安排行程

1- 思路

思路:

  • 本题实际上是一个搜索的过程,即搜索满足输入条件 从起点到 一个终点可达的路径,同时路径要满足字典序小的排在前面。因此需要借助一个数据结构,实现存储当前机场可达到的 目的地机场,且存储可以达到的次数,即机票数。
  • 本题以输入:[[“JFK”, “KUL”], [“JFK”, “NRT”], [“NRT”, “JFK”]为例,抽象为树形结构如下:

引用carl:代码随想录


根据上述思路使用以下数据结构
数据结构:

  • 定义一个 HashMap 结构为 <String,Map<String,Integer>>:其中Map的第一个 String 存储的是出发点,第二个 String 存储的为目的地,Integer 存储的是从出发点到目的地的机票数。
  • List<String> res:收集最终的路线结果集

回溯三部曲

  • 1. 回溯函数参数及返回值
  • 本题主要通过将输入的 List<List> 存入 map 中,通过定义全局变量 map 的形式来进行回溯,因此回溯参数传入的是 ticketNum 即机票数量。
  • 函数返回值是 boolean
  • 因为我们只需要找到一个行程,就是在树形结构中唯一的一条通向叶子节点的路线,如图:

  • 所以找到了这个叶子节点了直接返回。
private boolean BackTracing(int ticketNum)
  • 其中 resmap 需要初始化
    • 定义 Map<String,Integer> temp ,用于对当前出发点的 目的地机票数 进行操作。
    • 如果当前出发点存在,则获取当前出发点,将现有 目的地 存入,或 +1
    • 如果当前出发点不存在,则利用 TreeMap的特性,保证 temp 中的目的地顺序是升序
for(List<String> t : tickets) {Map<String,Integer> temp;// 如果在if(map.containsKey(t.get(0))){temp = map.get(t.get(0));temp.put(t.get(1),temp.getOrDefault(t.get(1),0)+1);}else{// 不存在temp = new TreeMap();temp.put(t.get(1),1);}map.put(t.get(0),temp);
}
res.add("JFK");

  • **2. 回溯终止条件 **
  • 因为 res 记录的是 结果集,而 ticketNum 记录的是 路径数,路径比节点数少 1 ,因此终止条件是 res.size() == ticketNum+1
// 3.2 终止条件
if(res.size() == ticketNum+1){return true;
}
  • 3. 回溯逻辑
  • 获取 res 中的最后一个元素,通过 forEach 循环来遍历 key 为最后一个元素的 结果集
  • count为机票数,若机票数 count > 0 则进行 递归和回溯
    • res 收集当前 目的地
    • target 列表记录数减 1
    • 递归
    • 回溯 res
    • 回溯 target
if(map.containsKey(last)){// 遍历 mapfor(Map.Entry<String,Integer> target : map.get(last).entrySet()){int count = target.getValue();if(count>0){res.add(target.getKey());target.setValue(count-1);if(BackTracing(ticketNum)) return true;res.removeLast();target.setValue(count);}}}

2- 题解

⭐重新安排行程 ——题解思路

在这里插入图片描述

class Solution {List<String> res = new ArrayList<>();Map<String,Map<String,Integer>> map = new HashMap<>();public List<String> findItinerary(List<List<String>> tickets) {// 初始化for(List<String> t :tickets){Map<String,Integer> tmp;// 如果存在if(map.containsKey(t.get(0))){tmp = map.get(t.get(0));tmp.put(t.get(1),tmp.getOrDefault(t.get(1),0)+1);}else{tmp = new TreeMap();tmp.put(t.get(1),1);}map.put(t.get(0),tmp);}res.add("JFK");backTracing(tickets.size());return res;}// 回溯public boolean backTracing(int tNum){if(res.size() == tNum+1){return true;}// 回溯String last = res.getLast();// 如果有if(map.containsKey(last)){// 遍历 mapfor(Map.Entry<String,Integer> target : map.get(last).entrySet()){// 递归 && 回溯int count = target.getValue();if(count>0){res.add(target.getKey());target.setValue(count-1);if(backTracing(tNum)) return true;res.removeLast();target.setValue(count);}}}return false;}
}

题目2: N皇后

  • 题目链接:N 皇后

1- 思路

  • 题目所求,在 n*n 的棋盘中方 n 个皇后,且 n 皇后满足 不存在 _**同行、同列、同对角 **_的元素。

递归树

  • 递归树每层的结果实际上是每层皇后的所取的位置

思路:

  • 1. 数据结构
    • List<List<String>> res:收集结果
  • 2. 回溯三部曲
    • 2.1 回溯参数及返回值
      • int n:棋盘大小
      • int row:回溯到第几行
      • char[][] cheesboard: 棋盘数组
    • 2.2 回溯终止条件 && 结果收集
      • 如果 row 遍历到了 n 的大小,则证明已经求出一个解,此时直接收集结果
    • 2.3 回溯逻辑
      • 如果当前遍历的位置 符合(isValid) 结果则进行 递归+回溯
      • cheesboard[row][i] 进行放棋子
      • 递归 backTracing(n,i+1,cheesboard)
      • 回溯 cheesboard[row][i]
  • 3. 实现 isValid 函数判断是否有效
    • 行判断
    • 列判断
    • 左上判断
    • 右上判断
  • 4. 实现 Array2List 函数,收集 char 数组的结果
    public List Array2List(char[][] cheesboard){List<String> list = new ArrayList<>();for(char[] c:cheesboard){list.add(String.copyValueOf(c));}return list;}

2- 题解

⭐N皇后 ——题解思路

在这里插入图片描述

class Solution {List<List<String>> res = new ArrayList<>();public List<List<String>> solveNQueens(int n) {// 定义 cheesboard 并初始化char[][] cheesboard = new char[n][n];for(char[] c:cheesboard){Arrays.fill(c,'.');}backTracing(n,0,cheesboard);return res;}public void backTracing(int n,int row,char[][] cheesboard){// 终止if(row == n){res.add(Array2List(cheesboard));return ;}// 回溯for(int i = 0 ; i < n;i++){if(isValid(row,i,n,cheesboard)){cheesboard[row][i] = 'Q';backTracing(n,row+1,cheesboard);cheesboard[row][i] = '.';}}}public List Array2List(char[][] cheesboard){List<String> list = new ArrayList<>();for(char[] c:cheesboard){list.add(String.copyValueOf(c));}return list;}public boolean isValid(int row,int col,int n,char[][] cheesboard){// 列for(int i = 0;i<row;i++){if(cheesboard[i][col] =='Q' ){return false;}}// 行for(int i = 0;i<col;i++){if(cheesboard[row][i] =='Q' ){return false;}}// 45for(int i =row-1,j = col-1; i>=0 && j>=0 ;i--,j--){if(cheesboard[i][j]=='Q'){return false;}}for(int i =row-1,j = col+1; i>=0 && j<=n-1 ;i--,j++){if(cheesboard[i][j]=='Q'){return false;}}return true;}
}

题目3: 解数独(跳过)

  • 题目链接:37. 解数独

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

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

相关文章

2024第24届营养健康展/北京健康展/健康食品展

第24届中国国际营养健康产业博览会 2024HEC营养健康展/北京健康展/大健康展 2024北京大健康展/营养健康展/北京健康展 2024第24届营养健康展/北京健康展/健康食品展 2024北京健康展/营养品展/HEC营养健康展 HEC2024与您共同打造健康梦&#xff0d;做中国最具权威性的大健康…

H264 编码标准常见术语解释

H264 编码标准 H.264编码标准&#xff0c;也被称作MPEG-4 AVC&#xff08;Advanced Video Coding&#xff09;&#xff0c;是一种被广泛使用的数字视频压缩标准&#xff0c;由国际电信联盟&#xff08;ITU-T&#xff09;和国际标准化组织&#xff08;ISO&#xff09;共同开发。…

ArcGIS教程:降雨量插值

一、目标 制作一副年平均降雨量的地图。 二、数据 某地的175个气象站数据的shp文件station.shp&#xff0c;以及这个地方轮廓的栅格数据idoutlgd。 数据下载链接&#xff1a;数据下载链接 三、制作方法 1.首先加载数据。 2.在菜单栏/customize/toolbars/中找到geostatisti…

AI图书推荐:如何用ChatGPT和Python进行数据可视化

《如何用ChatGPT和Python进行数据可视化》的原版英文图书标题&#xff1a;Python 3 Data Visualization Using ChatGPT - GPT-4 &#xff0c;作者是 Oswald Campesato &#xff0c;2023年出版 本书旨在向读者展示Python 3编程的概念和数据可视化的艺术。它还探讨了使用ChatGPT/…

模块化 DeFi L2 “Mode” 整合 Covalent Network(CQT),以获 Web3 最大数据集的支持

Covalent Network&#xff08;CQT&#xff09;&#xff0c;作为 Web3 领先的数据层&#xff0c;宣布其统一 API 将与 Mode 集成&#xff0c;以加快其基于以太坊构建的专注于 DeFi 的模块化 Layer2 方案的数据访问速度。这一战略合作将通过为开发者提供更强大的工具和能力&#…

8.0MGR单主模式搭建_克隆(clone)插件方式

为了应对事务一致性要求很高的系统对高可用数据库系统的要求&#xff0c;并且增强高可用集群的自管理能力&#xff0c;避免节点故障后的failover需要人工干预或其它辅助工具干预&#xff0c;MySQL5.7新引入了Group Replication&#xff0c;用于搭建更高事务一致性的高可用数据库…

快解析搭建网站解决方案

在如今网络时代下&#xff0c;各行各业都需要有自己的门户网站。 企业搭建自己的门户网站&#xff0c;有着众多实际意义: 1.可以全面详细地介绍企业及企业产品&#xff0c;这是企业网站的一个最基本的功能。企业可以把任何想让大众知道的信息放到网站&#xff0c;当人们想知道…

如何从架构层面降低公有云多可用区同时故障的概率

阿里云和腾讯云都曾出现过因一个组件故障而导致所有可用区同时瘫痪的情况。本文将探讨如何从架构设计的角度减小故障域&#xff0c;在故障发生时最小化业务损失&#xff0c;并以 Sealos 的稳定性实践为例&#xff0c;分享经验教训。 抛弃主从&#xff0c;拥抱点对点架构 从腾…

Xilinx 7系列MMCM/PLL 编程时参数值的确定

MMCM/PLL 的编程必须遵循一套流程&#xff0c;以确保配置的稳定性和性能。本文将描述了如何根据特定的设计要求来编程 MMCM/PLL。设计可以通过两种方式实现&#xff1a;直接通过图形用户界面&#xff08;Clocking Wizard 时钟向导&#xff09;或通过实例化来实现 MMCM/PLL。无论…

LabVIEW与Modbus协议的多点温度监控系统

LabVIEW与Modbus协议的多点温度监控系统 随着工业自动化和智能化水平的不断提升&#xff0c;对于现场监控技术的需求日益增长。开发了一种基于LabVIEW与Modbus协议的多点温度监控系统&#xff0c;实现高效、准确的温度数据采集、处理和显示&#xff0c;以及数据存储功能&#…

python爬虫学习第二十八天-------了解scrapy(二十八天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

related_name和related_query_name属性

在Django模型继承中&#xff0c;假如在外键或多对多字段中使用了related_name属性或related_query_name属性&#xff0c;则必须为该字段提供一个独一无二的反向名字和查询名字。但是&#xff0c;这样在抽象基类中一般会引发问题&#xff0c;因为基类中的字段都被子类继承并且保…

Photoshop 2024 25.4蓝猫版_支持参数滤波器和Ai神经滤镜

网盘下载 Photoshop 2024 (Beta) 蓝猫版v25.4.0(2426)全新功能&#xff1a;支持参数滤波器和AI神经滤镜。 最新的PS 25.4 Beta版新增了参数滤波器&#xff08;Parametric Filters&#xff09;功能&#xff0c;而正式版的PS 2024还没有这个功能&#xff0c;只有Beta版才有&…

数据可视化———Tableau

基本认识&#xff1a; 维度&#xff1a;定性—字符串文本&#xff0c;日期和日期时间等等 度量&#xff1a;定量—连续值&#xff0c;一般属于数值 数据类型&#xff1a; 数值 日期/日期时间 字符串 布尔值 地理值 运算符 算数运算符&#xff1a;加减乘除,%取余&#xff0c;…

vue: vscode安装扩展Volar失败(保姆级教程+图文结合)

1 vscode插件离线下载vsix文件 2.1 打开vscode插件市场地址 ​​​​​​https://marketplace.visualstudio.com/search?termvue&targetVSCode&categoryAll%20categories&sortByRelevance 2.2 搜索插件,Vue.volar 1 2.3 下载vsix文件 打开 vetur插件地址&…

GUI测试首推!TestComplete 帮助有效缩短 40-50% 测试时长!

TestComplete 是一款自动化UI测试工具&#xff0c;这款工具目前在全球范围内被广泛应用于进行桌面、移动和Web应用的自动化测试。 TestComplete 集成了一种精心设计的自动化引擎&#xff0c;可以自动记录和回放用户的操作&#xff0c;方便用户进行UI&#xff08;用户界面&…

蓝桥杯:日期问题(我的绝望题)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;每日一练 &#x1f337;追光的人&#xff0c;终会万丈光芒 目录 前言&#xff1a; &#x1f337;1.问题描述&#xff1a; 1.问题描述&#xff1a; 2.输入格式&#xff1a; 3.输出格式&#…

常见大厂面试题(SQL)01

知乎问答最大连续回答问题天数大于等于3天的用户及其对应等级 1.描述 现有某乎问答创作者信息表author_tb如下(其中author_id表示创作者编号、author_level表示创作者级别&#xff0c;共1-6六个级别、sex表示创作者性别)&#xff1a; author_id author_level sex 101 …

Linux下怎么快速部署MySQL服务,并使用

下载镜像 [zrylocalhost ~]$ docker pull mysql Using default tag: latest latest: Pulling from library/mysql bce031bc522d: Pull complete cf7e9f463619: Pull complete 105f403783c7: Pull complete 878e53a613d8: Pull complete 2a362044e79f: Pull complete 6e4d…

文件包含漏洞基础

php 中的文件包含函数&#xff1a; incude &#xff1a; require incude_once require_once 为了减少重复性代码的编写&#xff1b; 任意后缀的文件当中只要存在 php 代码就会被当作 php 执行&#xff1b; 本质&#xff1a;由于包含的文件不可控&#xff0c;导致文件包含…