Leetcode热题100:图论
Leetcode 200. 岛屿数量
深度优先搜索法:
对于这道题来说,是一个非常经典的图的问题,我们可以先从宏观上面来看问题,也就是说在不想具体算法的前提下,简单的说出如何找到所有的岛屿呢?

如图中所示,首先非常显而易见的要素就是我们一定要遍历图中的每一个坐标,这是肯定的,然后呢对于岛屿的数量,一开始想的肯定就是每当我们访问了一个1的坐标时,我们就找到了一个岛屿,可是因为我们要遍历整个图,所以肯定不能每次遇到一个1就对岛屿的数量进行增加,因为题目说了,横纵连接着的坐标都是1的话都属于同一个岛屿,就像上图一样证明我们只有三个岛屿
那么我们是不是可以像一个办法,当我们找到了一个岛屿的坐标后,把属于这个坐标的岛屿的其他所有值为1的坐标都记录下来,这样以来,意思就是说在我们继续遍历的时候,我们检查每一个坐标时,如果发现这个坐标已经被标记过了,证明他并不是一个新的岛屿而是一个之前就发现过的岛屿的一部分那么就可以了
如何去实现这个标记的方法呢,就可以用到我们的深度优先搜索,从新发现的坐标开始一直找,直到找到了岛屿的边缘或者整个图的边缘之后返回,这样就能找到所有属于相同岛屿的坐标,那么我们可以把主代码写出来了已经
class Solution:def numIslands(self, grid: List[List[str]]) -> int:res = 0# iterate to check every box in the grid to see# if it is a start for a new lslandfor r in range(len(grid)):for c in range(len(grid[0])):# if so, run a dfs to mark all its fellow# box and add the 1 to the resultif grid[r][c] == '1':dfs(grid, r, c)res = res + 1return res
主体部分的代码非常简单,然后呢我们需要做的就是对于dfs的编写,正如在这个主体代码中写的,你会发现我这里还是用的如果box中存的元素是1,那就最终要增加岛屿数量,这难道不是错的吗?其实这里就隐喻了我们是如何完成对一个岛屿上所有的box进行标记的,与其新建一个空间例如集合然后把dfs中搜索到的box全都加入进去然后每一次循环遍历的时候去看当前的box是否在那个集合中,更好的方法其实就是直接原地更改我们的grid,将搜索到的box中的值从1修改到2,这样这个主体函数中的if 语句就不会被execute了
class Solution:def numIslands(self, grid: List[List[str]]) -> int:def dfs(grid, r, c):# base case, do nothing when we# reached the edge of entire grid or found waterif not (0 <= r < len(grid) and 0 <= c < len(grid[0])) or grid[r][c] != '1':return# mark the visited box as 2grid[r][c] = '2'# call the recursive case on each direction from current boxdfs(grid, r - 1, c)dfs(grid, r + 1, c)dfs(grid, r, c - 1)dfs(grid, r, c + 1)res = 0# iterate to check every box in the grid to see# if it is a start for a new lslandfor r in range(len(grid)):for c in range(len(grid[0])):# if so, run a dfs to mark all its fellow# box and add the 1 to the resultif grid[r][c] == '1':dfs(grid, r, c)res = res + 1return res
这样你就有了整个的代码,其实这种类型的深度优先搜索可以参考我们在二叉树的时候是怎么做的,无非也是一直遍历然后直到我们reach 到了leaf node然后发现新的node是空的时候就直接return,这里不过是多加了两个方向,在二叉树里的recursive case是对左右子节点继续call,这里是对上下左右四个横纵坐标的方向继续call,然后呢条件多加了一个,这里对应的不能超出边界就是二叉树中的if not root, 只是这里还要保证grid[r][c] == 1,不是1的话就不是我们要找的同一个岛屿上的点
时间复杂度 O(m*n):m和n就是grid的长和宽,因为我们要遍历每一个坐标
空间复杂度 O(m*n):在最坏的情况下,如果左上角的box就是陆地1,并且整张图都是1, 那么我们就要把每一个box都有一个recursive function,这样在就会用 到一个大小为m*n的栈
Leetcode 994. 腐烂的橘子
广度优先搜索法:
这道题的关键在于我们在一开始所给的grid里面存在多个橘子的可能,我们需要在把能弄腐烂的橘子全部弄完之后就返回结果,所以每一分钟里我们需要对所有当前的橘子进行扩散,这里运用深度优先的递归就很麻烦,因为我们每一次逻辑要处理多个搜索
这里我们就使用广度优先,利用队列来对腐烂橘子进行保存并且通过出队来进行遍历然后扩散后把新的腐烂的橘子继续加入队列
这样以来,每一次我们通过向四个方向的检查中发现新的好橘子之后就可以立马对其进行操作,具体分三步,第一步将其加入我们的队列代表下一轮遍历的时候,他会pop出来作为新的坐标然后向四周扩散,第二步将我们的好橘子的count做一个递减,第三步,将grid中其坐标位置的值从1变成2避免后序的遍历中反复visit这个坏橘子
class Solution:def orangesRotting(self, grid: List[List[int]]) -> int:# we are using a queue to do the bfsq = deque()fresh_count = 0res = 0# loop through the gird first to find # the amount of fresh and add the rotten to# the queuefor i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j] == 1:fresh_count = fresh_count + 1elif grid[i][j] == 2:q.append((i, j))# loop until we have no more rotten orangewhile q and fresh_count > 0:# every time we start pop out q again, we did another searchres = res + 1# for each rotten orango, pop them outfor _ in range(len(q)):box = q.popleft()r, c = box[0], box[1]# check topif r - 1 >= 0 and grid[r - 1][c] == 1:fresh_count = fresh_count - 1q.append((r - 1, c))grid[r - 1][c] = 2# check rightif c + 1 < len(grid[0]) and grid[r][c + 1] == 1:fresh_count = fresh_count - 1q.append((r, c + 1))grid[r][c + 1] = 2# check botif r + 1 < len(grid) and grid[r + 1][c] == 1:fresh_count = fresh_count - 1q.append((r + 1, c)) grid[r + 1][c] = 2# check leftif c - 1 >= 0 and grid[r][c - 1] == 1:fresh_count = fresh_count - 1q.append((r, c - 1))grid[r][c - 1] = 2# we did not get them all rottonif fresh_count > 0:return -1else:return res
时间复杂度 O(m*n):m和n就是grid的长和宽,因为我们要遍历每一个坐标
空间复杂度 O(m*n):在最坏的情况下,一开始所有的橘子都是坏橘子,我们使用的额外空间队列的长度最大就是m*n
相关文章:
Leetcode热题100:图论
Leetcode 200. 岛屿数量 深度优先搜索法: 对于这道题来说,是一个非常经典的图的问题,我们可以先从宏观上面来看问题,也就是说在不想具体算法的前提下,简单的说出如何找到所有的岛屿呢? 如图中所示&#x…...
刚进公司第一天-电脑环境搭建
写在前面 之前在公司做过一次开发小工具的分享,这两天有个同事找我学习一些小工具开发的知识,但是我发现他的基础是真的差,想学开发知识却连自己本地电脑环境都没弄好,确实,有些人工作了很久,由于自己工作中…...
kubernetes集群报 unable to load bootstrap kubeconfig处置思路
一.现状和问题现象 公司kubernetes集群是通过kubeadm工具安装的,使用1年之后证书到期。在 kubernetes control plane maste节点服务器上运行 kubeadm certs renew all 命令更新证书后,kubelet 无法正常启动,报错日志如下 Failed to run kube…...
MacBook远程桌面Windows使用Microsoft Remote Desktop for Mac_亲测使用
MacBook远程桌面Windows使用Microsoft Remote Desktop for Mac_亲测使用 像Windows上有自带的远程桌面连接软件.MacBook没有自带的远程连接Windows桌面的工具,需要安装软件来实现. 像远程桌面控制软件一般有 TeamViewer、向日葵远程控制, ToDesk, Microsoft Remote Desktop f…...
Huggingface 笔记:大模型(Gemma2B,Gemma 7B)部署+基本使用
1 部署 1.1 申请权限 在huggingface的gemma界面,点击“term”以申请gemma访问权限 https://huggingface.co/google/gemma-7b 然后接受条款 1.2 添加hugging对应的token 如果直接用gemma提供的代码,会出现如下问题: from transformers i…...
WebGL 理论基础 01 WebGL 基础概念
WebGL 理论基础 基础概念 WebGL 基础概念 顶点着色器的作用是计算顶点的位置。根据计算出的一系列顶点位置,WebGL可以对点, 线和三角形在内的一些图元进行光栅化处理。当对这些图元进行光栅化处理时需要使用片段着色器方法。 片段着色器的作用是计算…...
Leetcode 28:找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入:haystack &q…...
docker opensearch arm64 运行失败解决方案
opensearch版本 2.1.0 docker日志错误信息: Disabling execution of install_demo_configuration.sh for OpenSearch Security Plugin Enabling OpenSearch Security Plugin Killing opensearch process 10 OpenSearch exited with code 143 Performance analyze…...
C#、ASP、ASP.NET、.NET、ASP.NET CORE区别、ASP.NET Core其概念和特点、ASP.NET Core个人心得体会
C#是一种面向对象的编程语言,主要用于开发跨平台的应用程序。它是.NET框架的一部分,并且可以在.NET平台上运行。 ASP(Active Server Pages)是一种用于构建动态Web页面的技术,使用VBScript或JScript作为服务器端脚本语…...
SpringMVC 简介及入门级的快速搭建详细步骤
MVC 回顾 MVC,即Model-View-Controller(模型-视图-控制器)设计模式,是一种广泛应用于软件工程中,特别是Web应用开发中的架构模式。它将应用程序分为三个核心组件: Model(模型)&#…...
Flutter编译卡在Running Gradle task ‘assembleDebug
1、翻墙 2、修改国内镜像源(以下以Flutter 3.19.3版本为例) 找到Flutter SDK目录下的Flutter配置文件resolve_dependencies.gradle 路径:flutter/packages/flutter_tools/gradle/resolve_dependencies.gradle 1)、第一处修改: g…...
基于springboot的牙科就诊管理系统
技术:springbootmysqlvue 一、系统背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样…...
C语言 指针练习
一、 a、b是两个浮点型变量,给a、b赋值,建立两个指针分别指向a的地址和b的地址,输出两个指针的值。 #include<stdio.h> int main() {float a,b,*p1,*p2;a10.2;b2.3;p1&a;p2&b;printf("a%f,b%f\n",a,b);printf("…...
【力扣 TOP100】 无重复字符的最长子串
题目描述: 思路: 使用left和right表示子串的端点。每次判断新的right是否在之前的子串里,如果在,则将left更新为新字符在子串里的位置(因为在此之间,没有更长的子串了)。如果不在则right1&…...
K8S node磁盘清理
K8S磁盘清理 K8S的部署形式相比传统非容器部署,会消耗更多的磁盘,在运行时可能会把磁盘占满。 这里以使用containerd运行时的K8S node为例,说明磁盘会用到那里了和如何清理磁盘 通用处理 磁盘清理: du -h --max-depth6 / 2>/dev/nul…...
2024年上半年软考,现在开始学真的来得及吗?
24上软考报名进行时,如果从现在开始学习来得及吗?只为拿证,还没报名的选哪科通过率高一点呢? 01、现在开始学来得及吗? 还没开始备考的考生,现在开始抓紧时间学还来得及,但是要正视软考的试题…...
SfM——八点法计算F矩阵(基础矩阵)与三角测量
1 八点法计算F矩阵(基础矩阵) 基础矩阵用于描述两个视图之间的几何关系 基础矩阵:基础矩阵 F F F 是描述两个视图之间相机投影关系的矩阵。对于两个对应的图像坐标点 ( x , y , 1 ) (x, y, 1) (x,y,1) 和 ( u , v , 1 ) (u, v, 1) (u,v,1…...
分布式事务的解决方案--Seata架构
一、Seata的XA模式 二、AT模式原理 三、TCC模式原理 四、MQ分布式事务 异步,非实时,实现最终的一致性。 四、分布式事务的解决方案...
【 React 】React JSX 转换成真实DOM的过程?
1. 是什么 react通过将组件编写的JSX映射到屏幕,以及组件中的状态发生了变化之后React会将这些「变化」更新到屏幕上 在前面文章了解中,JSX通过babel最终转化成React.createElement这种形式,例如: <div>< img src"…...
[Open3d]: 知识记录
python api 官方手册:http://www.open3d.org/docs/release/ 可视化:http://www.open3d.org/docs/release/tutorial/visualization/visualization.html python-vis 参考代码:https://github.com/isl-org/Open3D/tree/master/examples/python/v…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
