Leetcode hot100 图论

一、岛屿数量  中等

题目描述:给予一个二维网格grid,网格中“1”表示陆地,“0”表示水。计算网格中岛屿的数量。(岛屿只能由水平方向和垂直方向上的陆地组成)。

返回值:岛屿的数量。

思路:

(1)遍历二维网格,一旦遇到某个格子值为“1”,则从这个格子开始进行dfs,岛屿数量结果res++。dfs的逻辑见(2)。

(2)dfs,参数:网格,x,y。a.判断[x,y]是否在网格范围内,如果不在直接return,否则进行接下来的步骤;b.判断grid[x][y]是否等于1,如果不等于1,则直接return,否则修改值为2(或者任意其他标记表示该陆地格子已经被访问)并进行接下来的步骤;c.对该格子的上下左右分别进行dfs递归

注:这里dfs的作用是每当遇到网格中有一块陆地,就会通过遍历周围所有相连的陆地形成题目中所说的岛屿,并将这次遍历到的所有陆地进行额外的标记防止重复计算。

二、腐烂的橘子  中等

题目描述:给以一个二维网格,网格中0表示空,1表示新鲜橘子,2表示腐烂的橘子。每分钟,腐烂的橘子都可以使得其周围上下左右四个方向的新鲜橘子腐烂,求最小几分钟能让网格中的橘子全部腐烂。

返回值:不可能全部腐烂返回-1;能够全部腐烂返回最小分钟数。

思路:

(1)遍历二维网格,统计网格中新鲜橘子的数量good,并将所有腐烂橘子的坐标加入数组bads中。初始化结果分钟数min=0。

(2)while循环,只要bads数组不为空&&good>0就一直循环:另定义一个数组tmp赋值本次腐烂橘子bads,令bads=[](用于后续存储新一轮被腐烂的橘子),min++;内层for循环,遍历tmp中每个腐烂的橘子,如果该橘子的上下左右中有新鲜橘子,则置为2视为腐烂,并将其坐标加入bads中,good--。

(3)while循环结束后,如果good>0则返回-1,否则返回min。

三、课程表  中等

题目描述:完成某些课程之前必要先学习前置课(prerequisites数组记录了课程之间的关系,比如[a,b]表示在完成b之前必须完成a),一共有numClass个课程,判断是否能够完成所有课程。

ok,说了这么多,解读出来就是判断有向图是否有环(也就是是否存在拓扑排序)。

返回值:能够全部完成返回true,否则返回false。

思路:

(1)初始化pre数组(记录对应课程的入度有多少),map(记录对应课程的所有后续课程),队列queue(存储所有目前能访问的课程,入度为0的课程)。

(2)遍历prerequisites数组,记录每个课程的入度到数组pre中,更新map;接下来根据pre数组判断,如果pre[i]=0说明没有课程i没有前置课程可以访问,加入到队列queue中。令初始化num = queue.length(用于最后判断是否所有课程都被访问了)

(2)while循环,循环条件queue不为空(也就是还有能被访问的课程)。queue中的课程c出队,取出对应课程c存储在map的所有后续课程(这里注意有些课程可能没有后续课程,所以遇到map中没有对应键值对时应该怎么赋值),将这些后续课程的入度都减1,接着判断该后续课程的入度是否等于0,如果等于0就要加入queue中,并且num++。

(3)判断num是否等于numClass,如果相等,说明所有课程都能正常被访问返回true,否则返回false。

四、实现Trie(前缀树)  中等

看了眼题目 这是啥 后面再补充这个吧 稍微有点儿抽象。

总结:好久不刷图的题目 手生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值