题目:输出所有路径数
题目描述
思路:DFS
从起点开始,DFS,直到走到终点,用一个全局变量res[0]记录所有路径数量。
代码:
1 | ##dirs为上下左右方向 |
题目:图像渲染
题目描述
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标 (sr, sc)
表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor
,让你重新上色这幅图像。
为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。
最后返回经过上色渲染后的图像。
示例 1:
1 | 输入: |
思路:DFS
边界:如果当前值被浏览过则停止。即被赋予过新值。
递归子问题:从起点开始,将当前点赋值为新值,上下左右移动查看符合条件(值与起始点相同,在矩阵维度内)的位置点,进行DFS。
代码
1 | def floodFill(self, image, sr, sc, newColor): |
题目:单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
1 | board = |
思路:DFS
对所有的点进行遍历,找到第一个字母与word的第一个字母相同的,开始进行dfs。
代码
1 | class Solution: |
题目:岛屿的最大面积
题目描述
给定一个包含了一些 0 和 1的非空二维数组 grid
, 一个 岛屿 是由四个方向 (水平或垂直) 的 1
(代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)
示例 1:
1 | [[0,0,1,0,0,0,0,1,0,0,0,0,0], |
对于上面这个给定矩阵应返回 6
。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。
示例 2:
1 | [[0,0,0,0,0,0,0,0]] |
对于上面这个给定的矩阵, 返回 0
。
注意: 给定的矩阵grid
的长度和宽度都不超过 50。
思路:DFS
遍历矩阵,遇到 grid [i] [j] = 1时,就算值【采用dfs来算】
dfs : 先将grid [i] [j] 置0,然后再 return 1 + dfs [i-1] [j] + dfs [i+1] [j] +dfs [i] [j-1] +dfs [i] [j+1]
代码
1 | def maxAreaOfIsland(self, grid): |
题目:岛屿的个数
给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
思路:DFS
遍历矩阵,遇到 grid [i] [j] = 1时,将最大面积的岛屿置0【采用dfs来算】,res记录几个岛屿个数。
dfs : 将grid [i] [j] 置0
代码
1 | class Solution(object): |
题目:最大正方形
题目描述
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
1 | 输入: |
思路:动态规划
代码
1 | public class Solution { |
题目:01矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入:
1 | 0 0 0 |
输出:
1 | 0 0 0 |
示例 2:
输入:
1 | 0 0 0 |
输出:
1 | 0 0 0 |
注意:
- 给定矩阵的元素个数不超过 10000。
- 给定矩阵中至少有一个元素是 0。
- 矩阵中的元素只在四个方向上相邻: 上、下、左、右。
思路1:DFS
代码
1 | class Solution { |
思路2:BFS
题目:被围绕的区域
给定一个二维的矩阵,包含 'X'
和 'O'
(字母 O)。
找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
示例:
1 | X X X X |
运行你的函数后,矩阵变为:
1 | X X X X |
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O'
都不会被填充为 'X'
。 任何不在边界上,或不与边界上的 'O'
相连的 'O'
最终都会被填充为 'X'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
思路:DFS
题意就是找出被‘X’完全包围的‘O’的区域,填充为‘X’。
解决思路就是反向找出没有完全被‘X’完全包围的‘O’的区域,标记一下,然后没有标记的就是要被填充的。
- 思路就是绕着矩阵的最外圈转一圈,碰到‘O’,说明这里可以往里进行深搜;
- 将深搜经过的所有‘O’都标记成‘Y’;
- 外圈深搜完成后,所有没有被包围的‘O’都已经标记成了‘Y’;
- 将所有‘Y’填充为‘O’,所有‘O’填充为‘X’。
代码
1 | def solve(board): |