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

news2024/10/5 12:29:25

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 = val
        self.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 = val
        self.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 None

        visited = {}
        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 = 0
        for r in range(m):
            for c in range(n):
                if grid[r][c] == 1:
                    count += 1
                elif grid[r][c] == 2:
                    que.append((r,c))

        # 记录分钟数
        minute = 0
        directions = [(-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] = 2
                        que.append((n_r, n_c))
                        count -= 1
        if count > 0:
            return -1
        return 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 = word

        for i in range(len(board)):
            for j in range(len(board[0])):
                if self.dfs(board, i, j, 0): return True
        return False
    
    def 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 True
        
        board[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 True
        board[i][j] = self.word[k]
        return False

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

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

相关文章

高级分布式系统-第14讲 分布式控制经典理论

模糊控制 模糊控制是一种以模糊集合论、模糊语言变量以及模糊逻辑推理为数学基础的控制方法&#xff0c;它模拟人的思维&#xff0c;构造一种非线性控制&#xff0c;以满足复杂的不确定的过程控制的需要&#xff0c;属于智能控制范畴。 由于模糊控制是对人的思维方式和控制经验…

yarn和npm修改源

前提&#xff1a;由于npm&#xff0c;yarn默认镜像源&#xff0c;访问很慢&#xff0c;需要切换到国内的镜像源 npm &#xff08;1&#xff09;查看npm源的当前地址 npm config get registry &#xff08;2&#xff09;设置淘宝镜像 npm config set registry https://reg…

《C++大学教程》4.25星号正方形

题目: //while循环实现int main() {int n;cout << "请输入边长&#xff1a;";cin >> n;int i 1; while (i < n){ // 控制行数int j 1;while (j < n){ // 控制列数if (i 1 || i n || j 1 || j n){cout << "*";}else{cout <…

python解决求最短路径、最短时间问题

对于一个求最短路径的经常遇到的问题&#xff0c;对于从某一个节点到其余全部节点所需要的最短时间的问题&#xff0c;可以使用广度优先搜索算法的思路来进行解决&#xff0c;这是一个广度优先搜索算法在二维空间的应用。 问题描述为给定一个节点总数为N和一个列表list&#x…

代码随想录 Leetcode454. 四数相加 II

题目&#xff1a; 代码 (首刷看解析 2024年1月15日&#xff09;&#xff1a; class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {int n nums1.size();u…

浙江宁波象山县福利院部署清雷科技数字医养解决方案

“通过前台触屏电脑一体机&#xff0c;可以实时查看每位长者的生命体征情况&#xff0c;包括呼吸、心率、在离床状态、睡眠质量报告等&#xff0c;对呼吸异常、跌倒风险异常的长者还会特别标注提醒&#xff0c;不仅提高了照护人员的工作效率&#xff0c;还提升了对长者的安全保…

2719. 统计整数数目

给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 < x < num2min_sum < digit_sum(x) < max_sum. 请你返回好整数的数目。答案可能很大&#xff…

C语言关于指针函数可变参数的使用方法和打印相应数据

通过使用四个函数来实现 指针函数的可变参数操作&#xff1b; 四个函数分别为&#xff1a; #include <stdarg.h>va_list ap; //初始化 参数列表指针 va_start(ap, count); //将ap指针指向第一个参数COUNT 这个是必须存在的 否则无法定位到后面的参数 va_arg(a…

arrow,一个神奇的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - arrow。 Github地址&#xff1a;https://github.com/arrow-py/arrow 日期和时间处理是许多应用程序中的常见任务&#xff0c;但在 Python 中&#xf…

[Python进阶] Python操作MySQL数据库:pymysql

7.7 操作MySQL数据库&#xff1a;pymysql 7.7.1 准备工作(创建mysql数据库) PHPStudy介绍&#xff1a; phpstudy是一款非常有用的PHP开发工具&#xff0c;旨在帮助开发者更加便捷地进行PHP程序的开发与调试。它提供了一个友好的图形用户界面&#xff0c;使得用户能够方便地进…

Unity 编辑器篇|(五)编辑器拓展GUILayout类 (全面总结 | 建议收藏)

目录 1. 前言2. 参数3. 功能3.1 按钮&#xff1a;Button、RepeatButton3.2 文本&#xff1a;Label、TextArea、TextField、PasswordField3.3 工具栏&#xff1a;Toolbar3.4 切换框&#xff1a;Toggle3.5 滚动条&#xff1a;HorizontalScroll 、VerticalScroll3.6 滑条&#xff…

5G工业路由器专业版(视频监控专用5G路由器)

​大家好,今天给大家推荐一款强大的5G工业级路由器——SR510 5G工业级路由器系列产品。这款路由器集4G/5G网络、虚拟专网等多种技术于一体,提供稳定的工业级网络解决方案,非常适合部署在需要高速传输、低延时的视频监控场景中。 x更多详情&#xff1a;&#xff08;key-iot.com…

pytorch12:GPU加速模型训练

目录 1、CPU与GPU2、数据迁移至GPU2.1 to函数使用方法 3、torch.cuda常用方法4、多GPU并行运算4.1 torch.nn.DataParallel4.2 torch.distributed加速并行训练 5、gpu总结 往期回顾 pytorch01&#xff1a;概念、张量操作、线性回归与逻辑回归 pytorch02&#xff1a;数据读取Data…

.NET 反射的介绍和简单应用

什么是反射&#xff1f; 反射就是动态发现类型信息的能力。它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型&#xff0c;这些信息在设计时是未知的&#xff0c;这种能力类似于后期绑定。反射还支持的更高级的行为&#xff0c;能在运行时动态创建新类型&#xff0…

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

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

倒F天线设计经验分享

一、IFA天线理论分析 为了改善&#xff29;&#xff2c;&#xff21;天线难以使用的缺点&#xff0c;在&#xff29;&#xff2c;&#xff21;天线的基础上再增加一个倒L结构&#xff0c;形成IFA天线&#xff0c;此种天线体积小、易于匹配并具有双极化的特点&#xff0c;而在蓝…

「JavaSE」类和对象2

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;快来卷Java啦 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 类和对象2 &#x1f349;匿名对象&#x1f349;关键字static&#x1f34c;static修饰成员变量&#x1f34c;static修饰成员方法&…

springboot项目创建及采用本地tomcat打包发布

springboot项目发布 maven使用 解压maven安装包 修改配置文件settings.xml 更改镜像(使用maven添加依赖时&#xff0c;选择下载的地址&#xff0c;百度云已提供) <mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyu…

天津Java开发培训哪家好?选Java培训班要考虑

在当今社会&#xff0c;Java语言在软件开发领域具有举足轻重的地位&#xff0c;Java是一门面向对象编程语言&#xff0c;Java语言集合了C的优点&#xff0c;丢弃了缺点&#xff0c;所以Java语言表现的功能强大而简单易用&#xff0c;已经得到越来越多的应届毕业生和职场新人的认…

Vue Axios——前端技术栈

文章目录 基本介绍Vue是什么&#xff1f; MVVMVue的使用快速入门注意事项和使用细节 Vue 数据绑定机制分析数据单向渲染注意事项和细节 双向数据绑定事件绑定示例&#xff1a;注意事项和使用细节课后作业1课后作业2 修饰符示例 条件渲染/控制: v-if v-showv-if VS v-show课后作…