day30 | LeetCode 332.重新安排行程、LeetCode 51.N皇后、LeetCode 37.解数独

332.重新安排行程

本题是求解欧拉回路 / 欧拉通路的题目。

我们化简本题题意:给定一个 n 个点 m 条边的图,要求从指定的点出发,经过所有的边恰好一次可以理解为给定起点的「一笔画」问题。本体的附加的要求是这个一笔画的路径需要是路径的字典序最小。

一笔画问题与欧拉图或者半欧拉图有着紧密的联系,下面给出定义:

  • 通过图中所有边恰好一次且行遍所有顶点的通路称为欧拉通路;
  • 通过图中所有边恰好一次且行遍所有顶点的回路称为欧拉回路;
  • 具有欧拉回路的无向图称为欧拉图;
  • 具有欧拉通路但不具有欧拉回路的无向图称为半欧拉图。

因为本题保证至少存在一种合理的路径,们只需要输出这条欧拉通路的路径即可。如果没有说明肯定存在答案,那么这题又会变得更加复杂。

别看名字唬人,但这题其实思路挺清晰的,先用邻接表建图,然后在图中深搜,搜索过程中将走过的边(邻接关系)删除。

这个算法有个名字,叫 hierholzer 算法。用于解决已知图中存在欧拉路径,要找出一个欧拉路径的问题。过程如下:

  • 任选一个点为起点(题目告诉你了),遍历它所有邻接的边(设置不同的分支)。
  • DFS 搜索,访问邻接的点,并且将走过的边(邻接关系)删除。
  • 如果走到的当前点,已经没有相邻边了,则将当前点推入 res。
  • 随着递归的出栈,点不断推入 res 的开头,最后就得到一个从起点出发的欧拉路径。
class Solution {
public:unordered_map<string, vector<string>> graph; // 存储机场与可飞往的目的地列表vector<string> result; // 存储最终的旅行路径void dfs(const string& airport) {auto& destinations = graph[airport]; // 获取当前机场的目的地列表while (!destinations.empty()) { // 只要还有目的地就继续string next = destinations.back(); // 获取字典序最小的目的地destinations.pop_back(); // 移除这个目的地dfs(next); // 递归访问下一个目的地}result.push_back(airport); // 在返回过程中构建路径}vector<string> findItinerary(vector<vector<string>>& tickets) {// 构建图for (auto& ticket : tickets) {graph[ticket[0]].push_back(ticket[1]);}// 对每个机场的目的地列表按字典序降序排序,以便在DFS中按升序处理for (auto& pair : graph) {sort(pair.second.rbegin(), pair.second.rend());}// 开始深度优先搜索dfs("JFK");// 因为添加是在返回过程中完成的,所以要反转结果列表reverse(result.begin(), result.end());return result;}
};

51. N皇后

这题大体思路和以前的是差不多的,但实现细节出现了问题,我最开始是采用的思路是用 used 数组从上往下标记不能放的位置,for 循环内每放置一个皇后就将该行以下的不能放的位置标记,然后递归到下一层遍历。

但实现这个思路的时候发现有问题,我不好维护这个 used 数组,因为涉及回溯,这个数组很难回溯递归。

看了卡哥的题解,发现卡哥的判断是否合法是从当前位置往上看的,向上找两个斜角线上是否有皇后。

学习到了。

class Solution {
public:vector<vector<string>> result;// n 为输入的棋盘大小// row 是当前递归到棋盘的第几行了void backtracking(int n, int row, vector<string>& chessboard) {if (row == n) {result.push_back(chessboard);return;}for (int col = 0; col < n; col++) {if (isValid(row, col, chessboard, n)) { // 验证合法就可以放chessboard[row][col] = 'Q'; // 放置皇后backtracking(n, row + 1, chessboard);chessboard[row][col] = '.'; // 回溯,撤销皇后}}}bool isValid(int row, int col, vector<string>& chessboard, int n) {// 检查列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;}public:vector<vector<string>> solveNQueens(int n) {result.clear();std::vector<std::string> chessboard(n, std::string(n, '.'));backtracking(n, 0, chessboard);return result;}
};

37. 解数独

这题递归思路有,卡在判断是否合法了,交给二刷的我去思考了。我就直接看题解了。

class Solution {
private:
bool backtracking(vector<vector<char>>& board) {for (int i = 0; i < board.size(); i++) {        // 遍历行for (int j = 0; j < board[0].size(); j++) { // 遍历列if (board[i][j] == '.') {for (char k = '1'; k <= '9'; k++) {     // (i, j) 这个位置放k是否合适if (isValid(i, j, k, board)) {board[i][j] = k;                // 放置kif (backtracking(board)) return true; // 如果找到合适一组立刻返回board[i][j] = '.';              // 回溯,撤销k}}return false;  // 9个数都试完了,都不行,那么就返回false}}}return true; // 遍历完没有返回false,说明找到了合适棋盘位置了
}
bool isValid(int row, int col, char val, vector<vector<char>>& board) {for (int i = 0; i < 9; i++) { // 判断行里是否重复if (board[row][i] == val) {return false;}}for (int j = 0; j < 9; j++) { // 判断列里是否重复if (board[j][col] == val) {return false;}}int startRow = (row / 3) * 3;int startCol = (col / 3) * 3;for (int i = startRow; i < startRow + 3; i++) { // 判断9方格里是否重复for (int j = startCol; j < startCol + 3; j++) {if (board[i][j] == val ) {return false;}}}return true;
}
public:void solveSudoku(vector<vector<char>>& board) {backtracking(board);}
};

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

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

相关文章

14_Node.js和NPM入门指南

文章目录 NodeJS1.nodejs下载2.NPM的配置和使用3.NPM对一个项目进行初始化操作4.NPM本地仓库进行依赖下载5.查看当前项目有哪些依赖 https://www.npmjs.com/package NodeJS JS代码运行在哪里 1.浏览器2.nodejs 内置谷歌浏览器v8引擎 nodejs具有io磁盘 读写能力。类似java代码和…

【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)

导航&#xff1a; 本文一些内容需要聚簇索引、非聚簇索引、B树、覆盖索引、索引下推等前置概念&#xff0c;虽然本文有简单回顾&#xff0c;但详细可以参考下文的【MySQL高级篇】 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成…

Unity之UGUI合批规则

Unity3D UGUI系列之合批_unity ui合批-CSDN博客 总结&#xff1a; canvas 层级从上到下&#xff0c;从渲染角度&#xff0c;是从下往上&#xff0c;越先出现的越先被渲染从渲染角度&#xff0c;一个UI元素下面是否有重叠的UI元素 没有&#xff1a;depth0有&#xff1a; 仅有一…

乙二醇水溶液物性参数

1.1 乙二醇水溶液的冰点、沸点 乙二醇水溶液作为重要的载冷剂&#xff0c;其物理性质对设备和系统的设计都十分重要&#xff0c;下面是乙二醇水溶液的冰点沸点和其浓度的关系。&#xff08;数据来源 ASHRAE 手册 2005&#xff09; 1.2 乙二醇水溶液粘度 乙二醇水溶液作为重要…

【Java毕业设计】基于JavaWeb的旅游论坛管理系统

文章目录 摘 要目 录1 概述1.1 研究背景及意义1.2 国内外研究现状1.3 拟研究内容1.4 系统开发技术1.4.1 Java编程语言1.4.2 vue技术1.4.3 MySQL数据库1.4.4 B/S结构1.4.5 Spring Boot框架 2 系统需求分析2.1 可行性分析2.2 系统流程2.2.1 操作流程2.2.2 登录流程2.2.3 删除信息…

SQLServer 查询指定数据库名和表名及表结构等

查询当前数据库中所有表名&#xff0c;不用指定数据库&#xff0c;选中某数据库直接执行SQL就好 -- U:所有用户表名; S:所有系统表名;V:所有视图表名 SELECT name FROM sysobjects WHERE xtypeU OR xtypeS OR xtypeV 查询指定数据库数据库中所有表名&#xff0c; SELECT TAB…

使用 Ollama 本地运行各种 LLM

今天看看另外一个产品Ollama。Ollama 的安装非常简单&#xff0c;只需从官网&#xff08;https://ollama.com/download&#xff09;下载后解压缩&#xff0c;并在 Terminal 中运行脚本 ollama run llama3 即可完成环境设置。 我尝试运行 Llama3&#xff0c;虽然在运行时占用了大…

20240606在Toybrick的TB-RK3588开发板的Android12下确认HDMI的驱动

20240606在Toybrick的TB-RK3588开发板的Android12下确认HDMI的驱动 2024/6/6 9:48 【原文是在RK3328的Android7.1下写的。我将它升级成为RK3588的Android12了】 RK平台主要采用 FB 和 DRM 两种显示框架。与此相对应&#xff0c; HDMI 也有两套驱动。 FB&#xff1a; LINUX 3.10…

C语言 | Leetcode C语言题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> singleNumbers(vector<int>& nums) {int eor 0;for (int num:nums)eor ^ num;int rightOne eor & (~eor 1); // 提取出最右的1int onlyOne 0;for (int cur : nums) {if ((cur…

弘君资本今日投资参考:新能源消纳政策加码 智能网联汽车再加速

昨日&#xff0c;沪指午后在金融、酿酒等板块的带动下发力拉升&#xff0c;深证成指、创业板指走势微弱。截至收盘&#xff0c;沪指涨0.41%报3091.2点&#xff0c;深证成指涨1.05%报9469.32点&#xff0c;创业板指涨1.33%报1843.59点&#xff0c;上证50指数涨0.58%&#xff0c;…

[知识点]c++ future库 async方法

C 标准库中的 future 和 async 提供了一种便捷的方式来实现并发编程。std::async 是一个非常强大的工具&#xff0c;它可以用于启动异步任务&#xff0c;并返回一个 std::future 对象&#xff0c;该对象可以用来等待任务的结果。 std::async 的基本用法 std::async 用于启动一…

LCEDA使用:QA(不定期更新)

1. 优势&#xff1a; 器件库选择&#xff1a;可以在立创商城中选择器件库&#xff0c;操作便捷。面板切换&#xff1a;S快捷键在 画图/器件选择 面板中切换&#xff0c;不打断工作节奏。连续放置Net Label&#xff1a;连续放置net label的体验流畅。复制粘贴功能&#xff1a;复…

android-线程池3

工具类 package com.changan.incalleventservice.utils;import java.util.concurrent.Callable; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExec…

python之DeprecationWarning: invalid escape sequence ‘\/‘解决方案(亲测可用)

爬取的页面里包含很多 \ 双反斜杠&#xff0c; 想replace 出现 invalid escape sequence ‘/‘ 警告 出现警告的原因是 ‘unicode_escape’ 编码不支持 ‘/’ 这样的转义序列。&#xff0c;如果你想要处理 / 这样的转义序列&#xff0c;可以使用 ‘raw_unicode_escape’ 编码来…

论文阅读 Explainable Image Similarity Integrating Siamese Networks and Grad-CAM

给出论文&#xff08;Explainable Image Similarity Integrating Siamese Networks and Grad-CAM&#xff09;的内容解读、代码运行说明 论文链接&#xff1a;J. Imaging | Free Full-Text | Explainable Image Similarity: Integrating Siamese Networks and Grad-CAM (mdpi.c…

插入排序(排序算法)

文章目录 插入排序详细代码 插入排序 插入排序&#xff0c;类似于扑克牌的玩法一样&#xff0c;在有序的数组中&#xff0c;扫描无序的数组&#xff0c;逐一的将元素插入到有序的数组中。 实现细节&#xff1a; 从第一个元素开始&#xff0c;该元素可以认为已经被排序取出下…

Ansible-doc 命令

目录 基本用法 查看指定模块的文档 列出所有可用模块 搜索模块 显示模块参数的简单列表 显示详细的说明和示例 详细示例 查看 file 模块的文档 简略查看 copy 模块的参数 ansible-doc 是 Ansible 中的一个非常有用的命令行工具&#xff0c;它可以帮助你查找和显示Ansi…

基于ensp的园区网络搭建综合实验

核心技术介绍 1、虚拟局域网&#xff08;VLAN&#xff09; 2、链路聚合&#xff08;E-trunk&#xff09; 3、多生成树协议&#xff08;MSTP&#xff09; 4、VLANIF三层逻辑接口 5、虚拟路由冗余协议&#xff08;VRRP&#xff09; 6、开放式最短路径优先&#xff08;OSPF&…

灵动岛动效:打造沉浸式用户体验

灵动岛是专属于 iPhone 14 Pro 系列交互UI&#xff0c;通过通知消息的展示和状态的查看与硬件相结合&#xff0c;让 iPhone 14 Pro 系列的前置摄像头和传感器的“感叹号”&#xff0c;发生不同形状的变化。这样做的好处是让虚拟软件和硬件的交互变得更为流畅&#xff0c;以便让…

qt 与 x11 头文件同时引用,出现重定义的问题

qt 与 x11 头文件同时引用&#xff0c;出现重定义的问题 一、问题描述二、解决问题 一、问题描述 qt 与 x11 头文件同时引用&#xff0c;出现重定义的问题&#xff1a;expected identifier before numeric constant 二、解决问题 #include <X11/X.h> #include <X11…