Grind75第10天 | 133.克隆图、994.腐烂的橘子、79.单词搜索

133.克隆图

题目链接:https://leetcode.com/problems/clone-graph

解法:

这个题是对无向图的遍历,可以用深度优先搜索和广度有限搜索。

下面这个图比较清楚的说明了两种方法的区别。

DFS:从A开始克隆,遍历两个邻居B和D,遍历到B时,不管D了,继续遍历B的邻居A和C。其中A遍历过了,跳过。

BFS:从A开始克隆,遍历两个邻居B和D,B和D都遍历完了,再遍历B的邻居A和C。其中A遍历过了,跳过。

需要设置一个哈希表,记录遍历过的节点和它的克隆节点,以便再次遇到时直接返回,不需要再克隆。

参考题解:DFS+BFS

边界条件:

时间复杂度:O(N),其中 N 表示节点数量

空间复杂度:O(N)。存储克隆节点和原节点的哈希表需要 O(N)的空间

"""
# Definition for a Node.
class Node:def __init__(self, val = 0, neighbors = None):self.val = valself.neighbors = neighbors if neighbors is not None else []
"""
# DFS
from typing import Optional
class Solution:def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:self.visited = {}return self.dfs(node)def dfs(self, node):if not node:return None# 已经访问过,则直接返回克隆节点if node in self.visited:return self.visited[node]# 创建克隆节点clone_node = Node(node.val, [])# 标记为已访问self.visited[node] = clone_node# 遍历该节点的邻居,并递归的克隆邻居if node.neighbors:clone_node.neighbors = [self.dfs(n) for n in node.neighbors]return clone_node
"""
# Definition for a Node.
class Node:def __init__(self, val = 0, neighbors = None):self.val = valself.neighbors = neighbors if neighbors is not None else []
"""
# BFS
from typing import Optional
class Solution:def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:if not node:return Nonevisited = {}que = deque([node])visited[node] = Node(node.val, [])while que:cur_node = que.popleft()# 遍历邻居for n in cur_node.neighbors:if n not in visited:# 如果邻居没有被访问,则没有被克隆,那么克隆visited[n] = Node(n.val, [])# 并把邻居加入队列que.append(n)# 更新克隆节点的邻居visited[cur_node].neighbors.append(visited[n]) return visited[node]

994.腐烂的橘子

题目链接:https://leetcode.com/problems/rotting-oranges

解法:

这个题和【542.01矩阵】有点像,都是先把某个特定值的点加入到队列中,作为第0层,然后进行广度优先搜索,遍历第1层,第2层...

从某个结点出发,BFS 首先遍历到距离为 1 的结点,然后是距离为 2、3、4…… 的结点。因此,BFS 可以用来求最短路径问题。

题目要求:返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。翻译一下,实际上就是求腐烂橘子到所有新鲜橘子的最短路径

我们首先找出所有腐烂的橘子,将它们放入队列,作为第 0 层的结点。

然后进行 BFS 遍历,对上、下、左、右四个方向的结点进行污染,同时加入队列,作为第1层的节点。此时过去了一分钟。下一次BFS,需要一次性遍历第1层的所有节点,并且时间再加1分钟。

由于可能存在无法被污染的橘子,我们需要提前记录新鲜橘子的数量。在 BFS 中,每遍历到一个橘子(污染了一个橘子),就将新鲜橘子的数量减一。

BFS 结束后,新鲜橘子的数量仍未减为零,说明存在无法被污染的橘子,返回为-1,否则分钟数。

参考题解:BFS

边界条件:无

时间复杂度:O(mn)

空间复杂度:O(mn)

class Solution:def orangesRotting(self, grid: List[List[int]]) -> int:m, n = len(grid), len(grid[0])que = deque()# 统计新鲜橘子的个数,并把腐烂橘子加入到队列count = 0for r in range(m):for c in range(n):if grid[r][c] == 1:count += 1elif grid[r][c] == 2:que.append((r,c))# 记录分钟数minute = 0directions = [(-1,0), (1,0), (0,-1), (0,1)]while count > 0 and que:minute += 1# 注意这里不要命名为n,因为上面已经令n=len(grid[0])size = len(que)# 注意这里有循环,要把这一层一次性遍历完,因为这样1分钟内这一层都会腐烂for i in range(size):r, c = que.popleft()for d in directions:n_r, n_c = r+d[0], c+d[1]if 0 <= n_r < m and 0 <= n_c < n and grid[n_r][n_c] == 1:grid[n_r][n_c] = 2que.append((n_r, n_c))count -= 1if count > 0:return -1return minute

79.单词搜索

题目链接:https://leetcode.com/problems/word-search

解法:

这个题用回溯,回溯本身也是一种深度优先搜索。

从网格的每一个位置 (i,j) 出发,从上下左右4个方位去搜索k步(k为word的长度),搜到则返回True,否则从另一个位置出发去搜索。

减枝操作就是如果访问过了,就直接返回。

这个题没啥好说的,直接参考题解:深度优先搜索+回溯

边界条件:无

k 为 wod 的长度。

class Solution:def exist(self, board: List[List[str]], word: str) -> bool:self.word = wordfor i in range(len(board)):for j in range(len(board[0])):if self.dfs(board, i, j, 0): return Truereturn Falsedef dfs(self, board, i, j, k):# 如果越界if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]):return False# 如果不相等if board[i][j] != self.word[k]:return False# 如果匹配完毕if k == len(self.word) - 1:return Trueboard[i][j] = ''directions = [(-1, 0), (1,0), (0,-1), (0,1)]for d in directions:if self.dfs(board, i+d[0], j+d[1], k+1):return Trueboard[i][j] = self.word[k]return False

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

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

相关文章

数据结构期末复习(C语言版)

一、绪论 1.数据结构的术语 数据&#xff1a;所有能输入计算机并被计算机程序处理的符号的总称&#xff1b;数据元素&#xff1a;数据的基本单位&#xff1b;数据项&#xff1a;组成数据元素的、有独立含义的、不可分割的最小单位&#xff1b;数据对象&#xff1a;是性质相同…

springboot基于WEB的旅游推荐系统设计与实现

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1选题动因 当前…

云原生微服务之分布式锁框架 Redisson

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项目…

阿里云国际服务器设置安全防护程序

阿里云云服务器&#xff08;ECS&#xff09;提供弹性、安全、高性能、高性价比的虚拟云服务器&#xff0c;满足您的所有需求。立即在这里免费注册&#xff01; 常见 Web 应用程序 请勿对 Web 服务控制台&#xff08;如 WDCP、TOMCAT、Apache、Nginx、Jekins、PHPMyAdmin、Web…

陪诊小程序开发|陪诊软件定制|陪诊系统成品功能包含哪些?

陪诊小程序是一种便捷的工具&#xff0c;为用户提供一系列服务和功能&#xff0c;方便患者在就医过程中获得更好的体验和效果。接下来我们将介绍几个主要的陪诊小程序功能。 陪诊小程序开发功能&#xff1a; 一、预约挂号功能。陪诊小程序能够连接用户和医疗机构的系统&#x…

从头安装与使用一个docker GPU环境

GPU版docker的安装与使用 欢迎使用GPU版docker安装使用说明使用官方教程安装docker新建一个GPU版docker环境调用docker环境执行本地python文件 欢迎使用GPU版docker安装使用说明 使用官方教程安装docker 导入源仓库的GPG key curl -fsSL https://download.docker.com/linux/…

虹科分享 | 用Redis为LangChain定制AI代理——OpenGPTs

文章速览&#xff1a; OpenGPTs简介Redis在OpenGPTs中的作用在本地使用OpenGPTs在云端使用OpenGPTsRedis与LangChain赋能创新 OpenAI最近推出了OpenAI GPTs——一个构建定制化AI代理的无代码“应用商店”&#xff0c;随后LangChain开发了类似的开源工具OpenGPTs。OpenGPTs是一…

05-微服务Sentinel流量哨兵

一、Sentinel介绍 1.1 什么是Sentinel 分布式系统的流量防卫兵&#xff1a;随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点&#xff0c;在流量控制、断路、负载保护等多个领域开展工作&#xff0c;保障服务可靠性。特点&#xff1…

VSCode搭建 .netcore 开发环境

一、MacOS 笔者笔记本电脑上安装的是macOS High Sierra(10.13)&#xff0c;想要尝试一下新版本的.netcore&#xff0c;之前系统是10.12时&#xff0c;.netcore 3.1刚出来时安装过3.1版本&#xff0c;很久没更新了&#xff0c;最近.net8出来了&#xff0c;想试一下&#xff0c;…

redis夯实之路-键过期与发布订阅详解

设置键的生存时间或过期时间 Setex&#xff08;单位s&#xff09;&#xff0c;expire&#xff08;s&#xff09;&#xff0c;pexpire&#xff08;ms&#xff09;可以设置键的生存时间&#xff0c; Expirate&#xff0c;pexpirate设置键的过期时间&#xff08;timestamp的时间…

day08

回顾 1.选择排序原理: 找到最小值的下标&#xff0c;交换 2.冒泡排序原理: 比较相邻的两个元素&#xff0c;把最小值放到左边。第一次比较的时候最大值放到最右边了&#xff0c;以此类推今天的内容 1类和对象 2.类和对象内存 3.构造方法 1.从生活的角度区理解面向对象开发 有两…

Hologres + Flink 流式湖仓建设

Hologres Flink 流式湖仓建设 1 Flink Hologres2 实时维表 Lookup 1 Flink Hologres holo在实时数仓领域非常受欢迎&#xff0c;一般搭配flinkhologres来做实时数仓&#xff0c;中间分层用holo&#xff0c;上下游一般依赖于holo的binlog来下发数据 2 实时维表 Lookup Holo…

展厅设计原则都包含哪些

1、风格与品牌一致性 展厅设计应体现企业的品牌形象和价值观&#xff0c;从色彩、材料选择到整体布局&#xff0c;都应与企业的品牌风格保持一致。 2、空间规划和流线设计 展厅内不同区域需要有合理的空间规划和流线设计&#xff0c;使参观者能够便利地浏览展品和了解企业信息。…

基于YOLOv8深度学习的苹果叶片病害智能诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

走迷宫(c语言)

前言&#xff1a; 制作一个迷宫游戏是一个有趣的编程挑战。首先&#xff0c;我们需要设计一个二维数组来表示迷宫的布局&#xff0c;其中每个元素代表迷宫中的一个格子。我们可以使用不同的值来表示空格、墙壁和起点/终点。接下来&#xff0c;我们需生成迷宫。在生成迷宫的过程…

联手英特尔,释放星飞分布式全闪存储潜能

近日&#xff0c;英特尔官网发布了与 XSKY 星辰天合联手打造的解决方案&#xff0c;即 XSKY 的新一代全闪分布式存储系统 XINFINI&#xff0c;该存储系统采用英特尔 QAT 加速数据压缩/解压缩&#xff0c;从而大幅度提升存储系统性能。 全闪存储系统面临的解压缩挑战 在存储系统…

鸿蒙开发笔记(三):页面和自定义组件生命周期

先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定义组件为页面的入口组件&#xff0c…

Cypress安装与使用教程(4)—— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

计算机组成原理期末复习

文章目录 第一章&#xff1a;计算机系统漫游编译系统进程线程之间的关系存储器层次结构虚拟地址 第二章&#xff1a;信息的表示和处理大端与小端整数运算浮点数运算 第三章&#xff1a;程序的机器级表示栈的压入和弹出算数与逻辑运算操作指令条件判断与循环 第六章&#xff1a;…

【金猿案例展】首创证券——NoETL敏捷分析解决方案

‍ Aloudata 本项目案例由 Aloudata 投递并参与“数据猿年度金猿策划活动——2023大数据产业年度创新服务企业榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 党的十八大以来&#xff0c;党中央、国务院不断加大金融科技创新支持力度&#xff0c;扩大金融科…