通过万岁!!!
- 题目:给你一个二维数组,然后给你开始位置,从开始位置开始,与开始位置相同的部分,并且能到达的,都改成一个新的数。
- 思路:就是深度优先或者广度优先遍历就可以了,从开始位置,只要能到大,就改成新的数。如果用到广度优先bfs,则需要用一个队列,并且,需要获取队列的长度。但是我用dfs,速度会更加快一点。
- 技巧:bfs或者dfs。
java代码——bfs
class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
int tar = image[sr][sc];
if (tar == newColor) return image;
image[sr][sc] = newColor;
int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
Queue<Point> queue = new LinkedList<>();
queue.add(new Point(sr, sc));
int m = image.length;
int n = image[0].length;
int nx, ny, size;
while (!queue.isEmpty()) {
size = queue.size();
for (int i = 0; i < size; i++) {
Point remove = queue.remove();
for (int j = 0; j < 4; j++) {
nx = remove.x + dir[j][0];
ny = remove.y + dir[j][1];
if (nx >= 0 && nx < m && ny >= 0 && ny < n && image[nx][ny] == tar) {
image[nx][ny] = newColor;
queue.add(new Point(nx, ny));
}
}
}
}
return image;
}
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
}
java代码——dfs
class Solution {
int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int m, n, tar;
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
tar = image[sr][sc];
if (tar == newColor) return image;
image[sr][sc] = newColor;
m = image.length;
n = image[0].length;
fillColor(image, sr, sc, newColor);
return image;
}
public void fillColor(int[][] image, int sr, int sc, int newColor) {
for (int i = 0; i < 4; i++) {
int nx = sr + dir[i][0], ny = sc + dir[i][1];
if (nx >= 0 && nx < m && ny >= 0 && ny < n && image[nx][ny] == tar) {
image[nx][ny] = newColor;
fillColor(image, nx, ny, newColor);
}
}
}
}
总结:题目属于bfs和dfs的最基础题目了。之前简单的总结过dfs和bfs,在这里再次总结一下。dfs主要是按照一个方向,一直往下走。而bfs是一层一层的走,这时候就需要根据不同的问题进行分析了。