目录
1、图像渲染
1.1 算法原理
- 从(sr,sc)位置开始上下左右暴搜,将区域中符合条件的值修改为color。
- 细节问题:当 color == image[sr][sc]时,不需修改,直接返回即可。
1.2 算法代码
class Solution {
int[] dx, dy;
int[][] image;
int color;
int n, m;
int val;
public int[][] floodFill(int[][] image_, int sr, int sc, int color_) {
if(color_ == image_[sr][sc]) return image_;
image = image_;
val = image[sr][sc];
color = color_;
n = image.length;
m = image[0].length;
dx = new int[]{-1, 1, 0, 0};
dy = new int[]{0, 0, -1, 1};
image[sr][sc] = color;
dfs(sr, sc);
return image;
}
public void dfs(int i, int j) {
for(int k = 0; k < 4; k++) {
int x = i + dx[k];
int y = j + dy[k];
if(x >= 0 && x < n && y >= 0 && y < m && image[x][y] == val) {
image[x][y] = color;
dfs(x, y);
}
}
}
}
2、岛屿数量
2.1 算法原理
全局变量:
- boolean[][] check;//是否来过
- int ret;//返回值
- int[] dx;//横坐标上下左右
- int[] dy;//纵坐标上下左右
思想:
- 遍历矩阵,每次来到新的'1'区域,将这个区域中的所有'1'位置做好标记(check置为false),ret++
- 返回ret
2.2 算法代码
class Solution {
int[] dx = {1, -1, 0, 0};
int[] dy = {0, 0, 1, -1};
boolean[][] check;
int ret;
int m, n;
public int numIslands(char[][] grid) {
m = grid.length;
n = grid[0].length;
check = new boolean[m][n];
for(int i = 0; i < m ; i++) {
for(int j = 0; j < n; j++) {
if(check[i][j] == false && grid[i][j] == '1') {
ret++;
check[i][j] = true;
dfs(grid, i, j);
}
}
}
return ret;
}
public void dfs(char[][] grid, int i, int j) {
for(int k = 0; k < 4; k++) {
int x = i + dx[k];
int y = j + dy[k];
if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !check[x][y]) {
check[x][y] = true;
dfs(grid, x, y);
}
}
}
}