算法打卡26

今日任务:

1)332.重新安排行程

2)51.N皇后

3)37.解数独

332.重新安排行程

题目链接:332. 重新安排行程 - 力扣(LeetCode)

给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。

提示:
如果存在多种有效的行程,请你按字符自然排序返回最小的行程组合。例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前
所有的机场都用三个大写字母表示(机场代码)。
假定所有机票至少存在一种合理的行程。
所有的机票必须都用一次 且 只能用一次。

示例 1:
输入:[["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
输出:["JFK", "MUC", "LHR", "SFO", "SJC"]

示例 2:
输入:[["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
输出:["JFK","ATL","JFK","SFO","ATL","SFO"]
解释:另一种有效的行程是 ["JFK","SFO","ATL","JFK","ATL","SFO"]。但是它自然排序更大更靠后

文章讲解:代码随想录 (programmercarl.com)

思路:

这道题目是典型的图的遍历问题,可以使用深度优先搜索(DFS)来解决。思路如下:

  1. 首先,将机票信息存储在一个字典中,键为起始机场,值为从该机场出发的所有目的地的列表。
  2. 对每个起始机场的目的地列表进行排序,以保证在遍历时按字典序选择下一个机场。
  3. 从起始机场 JFK 开始,进行深度优先搜索,每次选择下一个目的地时,将该目的地从目的地列表中删除,表示已经使用过。
  4. 搜索过程中,如果某个机场的目的地列表为空,则说明到达了终点,返回当前路径。

class Solution:def findItinerary(self, tickets: List[List[str]]) -> List[str]:# 构建邻接表,键为起始机场,值为从该机场出发的目的地列表graph = defaultdict(list)  # 使用 defaultdict(list) 来创建一个默认值为列表的字典。这样,如果访问字典中不存在的键时,将返回一个空列表作为默认值。for start, end in tickets:# print(f'start:{start},end:{end}')  # start:JFK,end:SFOgraph[start].append(end)# print(graph)# 对目的地列表进行排序,保证按字典序选择下一个机场for start in graph:graph[start].sort()# print(graph)# 存储结果的列表self.result = []self.dfs('JFK',graph)return self.result# 定义深度优先搜索函数def dfs(self,start,graph):while graph[start]:# 选择当前机场的下一个目的地next_dest = graph[start].pop(0)self.dfs(next_dest,graph)# 在结果列表的最前面插入当前机场,表示当前路径self.result.insert(0, start)

感想:

这题要注意的是递归到叶子节点,所以先收集的是叶子节点,然后往回收集,所以我们这里应该是在结果的最前面插入当前机场

51.N皇后

题目链接:51. N 皇后 - 力扣(LeetCode)

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:这就是传说中的N皇后? 回溯算法安排!| LeetCode:51.N皇后哔哩哔哩bilibili

思路:

  1. 定义一个二维数组来表示棋盘,初始化为全部为 '.',表示空位。
  2. 从第一行开始,逐行放置皇后。
  3. 在每一行中,尝试将皇后放置在该行的每一个位置,检查是否与已放置的皇后冲突。
    • 冲突条件:新放置的皇后与已放置的皇后在同一列、同一行或同一条对角线上。
  4. 如果找到一个位置可以放置皇后,则递归进入下一行,继续放置下一个皇后。
  5. 如果无法找到一个位置放置皇后,则回溯到上一行,尝试放置下一个位置的皇后。
  6. 当成功放置了 n 个皇后时,将当前棋盘状态加入结果列表中。
  7. 继续回溯,直到遍历完所有可能的情况

class Solution:def solveNQueens(self, n: int) -> List[List[str]]:self.n = nself.result = []# 初始化棋盘# self.board = [['.'] * n] * n   # 虽然看起来是创建了一个 n × n 大小的二维列表,但实际上每一行都是相同的列表对象的引用。这意味着如果你修改了一个行的内容,其他行也会受到影响,因为它们共享相同的子列表。self.board = [['.' for _ in range(n)] for _ in range(n)]# print(f'初始化board-->{self.board}')self.backtracking(0)return self.resultdef is_valid(self, row, col):# print(f'点{(row,col)}')# 检查列上是否有皇后for i in range(row):if self.board[i][col] == 'Q':return False# 检查左上方是否有皇后for i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):# print(f'左上:{(i,j)}')if self.board[i][j] == 'Q':return False# 检查右上方是否有皇后for i, j in zip(range(row - 1, -1, -1), range(col + 1, self.n)):# print(f'右上:{(i,j)}')if self.board[i][j] == 'Q':return Falsereturn Truedef backtracking(self, row):# 如果当前行超过了棋盘大小,说明找到了一个解if row == self.n:self.result.append(["".join(row) for row in self.board])return# 在当前行的每个位置尝试放置皇后for col in range(self.n):if self.is_valid(row, col):self.board[row][col] = 'Q'self.backtracking(row + 1)self.board[row][col] = '.' # 回溯

感想:

在这里面之前犯了一个错误self.board = [['.'] * n] * n

虽然看起来是创建了一个 n × n 大小的二维列表,但实际上每一行都是相同的列表对象的引用。这意味着如果你修改了一个行的内容,其他行也会受到影响,因为它们共享相同的子列表。

为了避免这种情况,可以使用列表解析或循环来创建独立的子列表

self.board = [['.' for _ in range(n)] for _ in range(n)]

37.解数独

题目链接:37. 解数独 - 力扣(LeetCode)

编写一个程序,通过填充空格来解决数独问题。
一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 '.' 表示。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:回溯算法二维递归?解数独不过如此!| LeetCode:37. 解数独哔哩哔哩bilibili

思路:

  1. 使用回溯法解决数独问题。
  2. 递归地尝试在每个空白格子中填入数字,然后检查是否满足数独规则。
  3. 如果满足规则,则继续向下递归填写下一个空白格子,直到填满整个数独棋盘。
  4. 如果某个格子无法填入任何数字,则回溯到上一个格子重新尝试。

class Solution:def solveSudoku(self, board: List[List[str]]) -> None:"""Do not return anything, modify board in-place instead."""if self.backtracking(board):print(board)def backtracking(self,board):# 遍历整个数独棋盘for i in range (9):for j in range(9):# 如果当前格子不为空白,跳过if board[i][j] != '.':continue# 尝试填入数字1-9for num in map(str, range(1, 10)):# 如果填入的数字符合数独规则if self.is_valid(board,i,j,num):board[i][j] = num# 递归调用 solve 函数,继续填下一个空白格子if self.backtracking(board):return True# 如果填入的数字导致无解,则回溯到上一个格子,重新尝试其他数字board[i][j] = '.'# 遍历完1-9,还没有被返回,说明当前格子无法填入任何数字,则返回 Falsereturn False# 遍历完所有格子,还没有被False提前返回,说明所有空白格子都填满了,则表示找到了解法,返回 Truereturn Truedef is_valid(self,board,row,col,num):"""检查填入的数字是否符合数独规则"""# 检查行和列是否有重复数字for i in range(9):if board[row][i] == num or board[i][col] == num:return False# 检查3x3宫内是否有重复数字for i in range(3):for j in range(3):if board[(row//3)*3 + i][(col//3)*3 + j] == num:return Falsereturn True

感想:

这题与N皇后不一样的是有三个维度,不仅要遍历行列,确定一个位置后,还要依次填入1-9的数字

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

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

相关文章

菜狗学前端之JS高级笔记

老样子。复制上来的图片都没了,想看原版可以移步对应资源下载(资源刚上传,还在审核中) (免费) JS高级笔记https://download.csdn.net/download/m0_58355897/89102910 一些前提概念 一 什么是js高级 js高级是对js基础语法的一个补充说明,本质…

高效稳定转换!PW2205芯片轻松实现12V/24V转5V/3.3V 5A输出

在电子设备蓬勃发展的今天,高效稳定的电源转换技术成为了推动行业进步的关键。PW2205平芯微芯片推出的高效同步降压DC-DC转换器,以其出色的性能和广泛的应用领域,成为了市场上的热门选择。 PW2205转换器凭借其卓越的性能,为各类电…

AI智能滤镜解决方案,全新的视觉创作体验

一张精美的图片,一段引人入胜的视频,往往能够瞬间抓住观众的眼球,为企业带来不可估量的商业价值。然而,如何快速、高效地制作出高质量的视觉内容,一直是困扰众多企业的难题。美摄科技凭借其领先的AI智能滤镜解决方案&a…

电脑实时监控软件分享|五个好用的实时屏幕监控软件

电脑实时监控软件是一种专门设计用于实时监控和记录电脑用户操作行为、系统状态以及网络活动的软件工具。 这类软件主要服务于企业、教育机构、家庭或个人用户,用于确保网络安全、提升工作效率、监督员工行为、保护儿童在线安全、防止数据泄露等多种目的。 针对企业…

面试(01)————JVM篇,最大白话的一集,常见概念的讲解以及GC监控调优等等

一、JDK体系结构图 二、JVM整体架构 三、JVM组成 3.1、JVM内存区域的执行底层原理 ​编辑 3.1.1、程序计数器 3.1.2、堆栈关系的发现 3.1.3、方法去和堆的关系 3.1.4、堆(重点) 3.1.4.1、可达性分析算法 3.1、内存泄漏测试以及堆区的GC监控 3.…

电脑硬盘分区表的两种格式:MBR 和 GPT

电脑硬盘分区表的两种格式:MBR 和 GPT 段子手168 2024-4-5 电脑硬盘分区表有两种格式:MBR 和 GPT: 一、MBR 分区表 1.MBR 是主引导记录 (Master Boot Record) 的英文缩写 在传统(Legacy)硬盘分区模式中&#xff0c…

零基础入门NLP - 新闻文本分类比赛方案分享 nano- Rank1

nano- 康一帅 简介 环境 Tensorflow 1.14.0Keras 2.3.1bert4keras 0.8.4 文件说明 EDA:用于探索性数据分析。data_utils:用于预训练语料的构建。pretraining:用于Bert的预训练。train:用于新闻文本分类模型的训练。pred&a…

环形链表 II - LeetCode 热题 26

大家好!我是曾续缘😛 今天是《LeetCode 热题 100》系列 发车第 26 天 链表第 5 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 环形链表 II 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环&#xf…

每日OJ题_两个数组dp④_力扣44. 通配符匹配

目录 力扣44. 通配符匹配 解析代码 力扣44. 通配符匹配 44. 通配符匹配 难度 困难 给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 ? 和 * 匹配规则的通配符匹配: ? 可以匹配任何单个字符。* 可以匹配任意字符序列(包…

全面了解网络性能监测:从哪些方面进行监测?

目录 摘要 引言 CPU内存监控 磁盘监控 网络监控 GPU监控 帧率监控 总结 摘要 本文介绍了网络性能监测的重要性,并详细介绍了一款名为克魔助手的应用开发工具,该工具提供了丰富的性能监控功能,包括CPU、内存、磁盘、网络等指标的实时…

[C语言]——柔性数组

目录 一.柔性数组的特点 二.柔性数组的使用 三.柔性数组的优势 C99中,结构体中的最后⼀个元素允许是未知大小的数组,这就叫做『柔性数组』成员。 typedef struct st_type //typedef可以不写 { int i;int a[0];//柔性数组成员 }type_a; 有些编译器会…

B. Burning Midnight Oil Codeforces Round 112 (Div. 2)

题目链接: Problem - 165B - Codeforceshttps://codeforces.com/problemset/problem/165/B 题目大意: 最后写了至少n个,每次衰减k倍(/k),问最初的v最小为多少。 思路&方法: 二分答案。 AC代…

2024零废弃日青山少年可持续工坊走进南湖社区

“零废弃”不代表完全不产生任何垃圾,而是一种“尽可能避免产生废弃”的生活态度,每一个人都可以从零开始,从日常的随手小事开始,珍惜每一件物品、珍视每一种情绪,为生活腾出更大的空间。 2024零废弃日,北…

JS 表单验证

点击注册的时候&#xff0c;渲染出来&#xff0c;验证码是自动获取出来的 html&#xff1a; <div class"div1">用户名<input type"text" id"yhm"><span id"span1"></span><br>密码<input type"…

《Git版本控制管理》笔记

第三章 起步 git --version查看版本号git --help查看帮助文档裸双破折号分离参数 git diff -w master origin – tools/Makefile将当前目录或任何目录转化为Git版本库 git init 初始化之后项目目录中&#xff0c;有名为.git的文件git status 查看git状态git commit 提供日志消…

贪心算法|135.分发糖果

力扣题目链接 class Solution { public:int candy(vector<int>& ratings) {vector<int> candyVec(ratings.size(), 1);// 从前向后for (int i 1; i < ratings.size(); i) {if (ratings[i] > ratings[i - 1]) candyVec[i] candyVec[i - 1] 1;}// 从后…

格式化字符串漏洞原理及其利用(附带pwn例题讲解)

写在前面&#xff1a; 本篇博客为本人原创&#xff0c;但非首发&#xff0c;首发在先知社区 原文链接&#xff1a; https://xz.aliyun.com/t/14253?time__1311mqmx9QiQi%3D0%3DDQoDsNOfptD8nDCFdNNK4D&alichlgrefhttps%3A%2F%2Fxz.aliyun.com%2Fu%2F74789各位师傅有兴趣…

JQuery(三)---【使用JQuery动态设置浏览器窗口尺寸、JQuery的遍历】

零.前言 JQuery(一)---【JQuery简介、安装、初步使用、各种事件】-CSDN博客 JQuery(二)---【使用JQuery对HTML、CSS进行操作】-CSDN博客 一.JQuery动态设置浏览器窗口尺寸大小 1.1width()和height()方法 width()&#xff1a;设置或者返回元素的宽度(不包括内边距、边框或外…

React - 你知道在React组件的哪个阶段发送Ajax最合适吗

难度级别:中级及以上 提问概率:65% 如果求职者被问到了这个问题,那么只是单纯的回答在哪个阶段发送Ajax请求恐怕是不够全面的。最好是先详细描述React组件都有哪些生命周期,最后再回过头来点题作答,为什么应该在这个阶段发送Ajax请求。那…

智慧校园预付费水电表控制系统

在智慧校园建设中&#xff0c;预付费水电表控制系统成为了不可或缺的一部分&#xff0c;它采用了先进的信息技术手段确保校园水电资源的高效管理和使用。这种系统通过智能化、信息化的手段&#xff0c;不仅优化了能源管理&#xff0c;还大幅提升了校园管理的现代化水平。本文将…