一、岛屿数量 中等
题目描述:给予一个二维网格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(前缀树) 中等
看了眼题目 这是啥 后面再补充这个吧 稍微有点儿抽象。
总结:好久不刷图的题目 手生

1571

被折叠的 条评论
为什么被折叠?



