目录
关于FloodFill算法
- 爆搜,深搜,回溯的算法原理并不难,这类题目考察的就是我们的“代码能力”,就是我们能把思路转化为代码的能力
- FloodFill算法解决的问题主要就是:“在一个有很多区域的矩阵中,找到性质相同的一个连通块”,做法也很简单,就是先遍历矩阵,当找到符合性质的第一个小区域时,对这个区域做一次深度优先遍历即可
部分OJ题详解
733. 图像渲染


给我们一个矩阵,然后又给了我们一个下标,要我们找到与这个下标的值相同的所有相邻的区域并把它们修改成另一个数color,下面来分析下这道题:
- 解法很简单,就是从题目给我们的下标位置开始,上下左右依次做深度优先遍历即可,与我们上篇博客的解数独类题目类似,每次遍历后把符合要求的区域的值修改为color即可
- 需要注意的是,如果原始颜色和目标颜色一样,就直接返回即可
class Solution
{
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int m, n;
int prev; //存原始颜色
public:
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color)
{
prev = image[sr][sc];
m = image.size(), n = image[0].size();
dfs(image, sr, sc, color);
return image;
}
void dfs(vector<vector<int>>& image, int sr, int sc, int color)
{
if(image[sr][sc] == color) return;
image[sr][sc] = color;
for(int k = 0; k < 4; k++)
{
int x = sr + dx[k], y = sc + dy[k];
if((x >= 0 && y >= 0) && (x < m && y < n) && image[x][y] == prev)
{
dfs(image, x, y, color);
}
}
}
};
200. 岛屿数量

题目给我们一个二维矩阵,由两个值填充,1表示陆地,0表示水,题目要我们找出有多少个陆地组成的岛屿,如示例二,有3个陆地;下面来分析下这道题
- 这道题是FloodFill算法的一个应用,题目就是要我们找出所有相通区域的数量
- 其实有了上篇博客大量的题目练习的基础,这道题其实不难,基础算法也是深度优先遍历,然后把每个遍历后的区域用一个bool vis[][] 标记一下即可,就和“单词搜索”那道题一样
-
class Solution { vector<vector<bool>> vis; int dx[4] = {0, 0, -1, 1}; int dy[4] = {1, -1, 0, 0}; int m, n; int ret = 0; public: int numIslands(vector<vector<char>>& grid) { m = grid.size(), n = grid[0].size(); vis = vector<vector<bool>>(m, vector<bool>(n)); for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(!vis[i][j] && grid[i][j] == '1') { ret++; dfs(grid, i, j); } } } return ret; } void dfs(vector<vector<char>>

最低0.47元/天 解锁文章
8432

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



