算法刷题Day30 | 332.重新安排行程、51. N皇后、37. 解数独

news/2024/5/4 4:09:55/文章来源:https://blog.csdn.net/hhw_hhw/article/details/137546571

目录

  • 0 引言
  • 1 重新安排行程
    • 1.1 我的解题
    • 1.2 更好的解法
  • 2 N皇后
    • 2.1 我的解题
  • 3 解数独
    • 3.1 我的解题
    • 3.2

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:算法刷题Day30 | 332.重新安排行程、51. N皇后、37. 解数独
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

0 引言

听说今天的题目很难,但是我呢,必须拿下。

1 重新安排行程

  • 🎈 文档讲解
  • 🎈 视频讲解
  • 🎈 做题状态:

其实这道题就是有向图的深度有限搜索,使用递归的方式。其实也就是二叉树的前中后序遍历。
图的广度有限搜索也就对应二叉树的层次遍历,采用队列结构和while循环。

1.1 我的解题

其实就是回溯问题,只不过要想好终止条件,以及分支条件。但是我这个暴力搜索的方法超时了。

class Solution {
public:// 这个感觉就是递归,为什么需要回溯呢,会存在多条路径所以需要回溯void backTracing(vector<vector<string>>& tickets, vector<bool>& used, vector<string>& path, vector<vector<string>>& paths){// 终止条件if (path.size() == tickets.size() + 1){paths.emplace_back(path);return;}// 单层回溯逻辑for (int i = 0; i < tickets.size(); i++){// 如果当前路径没有使用过,且是满足路径的要求的话,则添加if (used[i] == false && tickets[i][0] == path[path.size() - 1]){path.emplace_back(tickets[i][1]);used[i] = true;backTracing(tickets, used, path, paths);path.pop_back();used[i] = false;}}}vector<string> findItinerary(vector<vector<string>>& tickets) {vector<bool> used(tickets.size(), false);vector<string> path = {"JFK"};vector<vector<string>> paths;backTracing(tickets, used, path, paths);// 从paths中找出字典排序最小的结果int minIndex = 0;for (int i = 1; i < paths.size(); i++){       if (paths[i] < paths[minIndex]){minIndex = i;}}  return paths[minIndex];}
};

1.2 更好的解法

首先得理解下面这段代码的含义。

unordered_map<string, map<string, int>> targets;
targets["JFK"]["TIS"]++;

targets["JFK"]["TIS"]++;

这行代码在做几件事情:
首先,它试图访问targets这个unordered_map的键为"JFK"的元素。如果"JFK"不存在于targets中,C++会自动创建这个键,并将其映射到一个新的(空的)内部map容器。
接着,它试图访问内部map(即"JFK"键对应的值)的键为"TIS"的元素。同样地,如果"TIS"不存在于这个内部map中,C++会自动创建这个键,并将其映射到一个int类型的值,这个值默认初始化为0(这是int类型的默认值)。
最后,++操作符会将"TIS"对应的值增加1。这意味着,我们就把从"JFK"到"TIS"的票数增加了1。

2 N皇后

  • 🎈 文档讲解
  • 🎈 视频讲解
  • 🎈 做题状态:

2.1 我的解题

我感觉不算太难,就是比较繁琐,时间复杂度需要控制。主要是判断当前位置是否合法,也就是根据行列号,棋盘元素进行判断。回溯直接就是模板。

我一开始写的代码判断是否有皇后可以优化,因为判断是一行一行往下的,所以皇后一定是在当前行的上面才有。所以在判断斜线方向是否有皇后时,只需判断上面的行的元素即可。也就是判断45°和135°。不需要判断225°和315°这两个方向。

class Solution {
private:
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;}
};

3 解数独

  • 🎈 文档讲解
  • 🎈 视频讲解
  • 🎈 做题状态:

3.1 我的解题

解数独好像是二维的N皇后问题。需要两层循环棋盘,然后递归放入不同的数。回想之前一维数组的回溯问题,首先就是一个循环遍历数组的不同位置,然后递归。现在可以把棋盘理解为二维数组,那么也就是两个循环遍历数组位置然后递归。


3.2

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

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

相关文章

【图论】详解链式前向星存图法+遍历法

细说链式前向星存图法 首先要明白&#xff0c;链式前向星的原理是利用存边来进行模拟图。 推荐左神的视频–建图、链式前向星、拓扑排序 比方说有这样一张图&#xff0c;我们用链式前向星来进行模拟时&#xff0c;可以将每一条边都进行编号&#xff0c;其中&#xff0c;红色的…

刷题DAY49 | LeetCode 121-买卖股票的最佳时机 122-买卖股票的最佳时机II

121 买卖股票的最佳时机&#xff08;easy&#xff09; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取…

【前端面试3+1】10 npm run dev 发生了什么、vue的自定义指令如何实现、js的数据类型有哪些及其不同、【最长公共前缀】

一、npm run dev发生了什么 运行npm run dev时&#xff0c;通常是在一个基于Node.js的项目中&#xff0c;用来启动开发服务器或者执行一些开发环境相关的任务。下面是一般情况下npm run dev会执行的步骤&#xff1a; 1. 查找package.json中的scripts字段&#xff1a; npm会在项…

双指针,滑动窗口

今天也是闲来无事&#xff0c;想去做一下&#xff0c;之前学过的某个题型&#xff0c;但是在中间突然发现了这个题&#xff0c;那时候年少无知&#xff0c;做不出来&#xff0c;今天也是很轻松的用双指针轻松拿捏&#xff0c;因此发帖。 传送门&#xff1a;逛画展 题解&#x…

VRRP虚拟路由实验(华为)

思科设备参考&#xff1a;VRRP虚拟路由实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种网络协议&#xff0c;用于实现路由器冗余&#xff0c;提高网络可靠性和容错能力。VRRP允许多台路由器…

官网下载IDE插件并导入IDE

官网下载IDEA插件并导入IDEA 1. 下载插件2. 导入插件 1. 下载插件 地址&#xff1a;https://plugins.jetbrains.com/plugin/21068-codearts-snap/versions 说明&#xff1a;本次演示以IDEA软件为例 操作&#xff1a; 等待下载完成 2. 导入插件 点击File->setting->Pl…

数据仓库与数据挖掘(第三版)陈文伟思维导图1-5章作业

第一章 概述 8.基于数据仓库的决策支持系统与传统决策支持系统有哪些区别&#xff1f; 决策支持系统经历了4个阶段。 1.基本决策支持系统 是在运筹学单模型辅助决策的基础上发展起来的&#xff0c;以模型库系统为核心&#xff0c;以多模型和数据库的组合形成方案辅助决策。 它…

2024年第八届人工智能与虚拟现实国际会议(AIVR 2024)即将召开!

2024年第八届人工智能与虚拟现实国际会议&#xff08;AIVR 2024&#xff09;将2024年7月19-21日在日本福冈举行。人工智能与虚拟现实的发展对推动科技进步、促进经济发展、提升人类生活质量等具有重要意义。AIVR 2024将携手各专家学者&#xff0c;共同挖掘智能与虚拟的无限可能…

利用Sentinel解决雪崩问题(二)隔离和降级

前言&#xff1a; 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩&#xff0c;就要靠线程隔离(舱壁模式)和熔断降级手段了&#xff0c;不管是线程隔离还是熔断降级&#xff0c;都是对客户端(调…

图片管理系统:原理、设计与实践

title: 图片管理系统&#xff1a;原理、设计与实践 date: 2024/4/9 20:04:25 updated: 2024/4/9 20:04:25 tags: 图片管理存储组织上传采集处理编辑搜索检索展示分享AI应用 第一章&#xff1a;图片管理系统概述 1.1 图片管理系统简介 图片管理系统是一种用于存储、组织、处理…

rocketmq和rabbitmq总是分不清?

1. 官方解答 摘自百度搜索&#xff1a; 2. 通俗易懂的回答

【unity】【C#】UGUI组件

文章目录 UI是什么对UI初步认识 UI是什么 UI是用户界面&#xff08;User Interface&#xff09;的缩写&#xff0c;它是用户与软件或系统进行交互的界面。UI设计旨在提供用户友好的界面&#xff0c;使用户能够轻松地使用软件或系统。UI设计包括界面的布局、颜色、字体、图标等…

爬虫逆向实战(40)-某江酒店登陆(AES、MD5)

一、数据接口分析 主页地址&#xff1a;某江酒店 1、抓包 通过抓包可以发现数据接口是/api/member/login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;有TDFingerprint、blackBoxMd5、password和sw四个加密参数&#x…

Java快速入门系列-6(数据库编程与JDBC)

第六章:数据库编程与JDBC 6.1 SQL基础6.1.1 SQL基本结构与命令6.1.2 SQL高级查询6.1.3 SQL子查询与联接6.2 JDBC原理与使用6.2.1 JDBC驱动程序与URL6.2.2 Statement、PreparedStatement与CallableStatement6.2.3 数据库事务处理6.3 数据库连接池6.4 事务管理6.1 SQL基础 SQL(…

数据结构——线性表(链式存储结构)

语言&#xff1a;C语言软件&#xff1a;Visual Studio 2022笔记书籍&#xff1a;数据结构——用C语言描述如有错误&#xff0c;感谢指正。若有侵权请联系博主 一、线性表的逻辑结构 线性表是n个类型相同的数据元素的有限序列&#xff0c;对n>0&#xff0c;除第一元素无直接…

电商技术揭秘十八:电商平台的云计算与大数据应用小结

电商技术揭秘相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xf…

Day:006(1) | Python爬虫:高效数据抓取的编程技术(爬虫工具)

selenium介绍与安装 Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;类型像我们玩游戏用的按键精灵&#xff0c;可以按指定的命令自动操作&#xff0c;不同是Selenium 可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&am…

社交网络的分布式治理:分析Facebook在区块链社区中的角色

随着区块链技术的快速发展&#xff0c;社交网络的治理模式也逐渐受到关注。传统的社交网络往往由中心化的平台掌控&#xff0c;用户的权力和参与度受到限制&#xff0c;而区块链技术为社交网络的分布式治理提供了新的解决方案。本文将深入探讨社交网络的分布式治理&#xff0c;…

使用R语言计算矩形分布(均匀分布)并绘制图形

理论部分 矩形分布&#xff08;均匀分布&#xff09;&#xff0c;是指在某一区间内&#xff0c;随机变量取任何值的概率都是相同的。这种分布的概率密度函数在一个特定的区间内是一个常数&#xff0c;因此其图形呈现出一个矩形的形状&#xff0c;故得名为“矩形分布”。在概率…

ETLCloud结合kafka的数据集成

一、ETLCloud中实时数据集成的使用 在ETLCloud中数据集成有两种方式&#xff0c;一种是离线数据集成&#xff0c;另一种便是我们今天所要介绍的实时数据集成了&#xff0c;两者的区别从名字便可以得知&#xff0c;前者处理的数据是离线的没有时效性的&#xff0c;后者的数据是…