Number of Islands
[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]
]
return 3.Basic Idea:
{-1, 0, 1, 0}
{0, -1, 0, 1}[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]
]
return 3. {-1, 0, 1, 0}
{0, -1, 0, 1} public class Solution {
/**
* @param grid a boolean 2D matrix
* @return an integer
*/
// 对每个值为true的点进行bfs,bfs的过程中遇到的点都标记为false,每次重新开始
// 进入bfs,则ret += 1
public int numIslands(boolean[][] grid) {
if (grid == null || grid.length == 0) return 0;
List<int[]> nodes = new ArrayList<>();
for (int i = 0; i < grid.length; ++i) {
for (int j = 0; j < grid[0].length; ++j) {
if (grid[i][j]) nodes.add(new int[]{i, j});
}
}
int ret = 0;
for (int[] cord : nodes) {
int r = cord[0], c = cord[1];
if (grid[r][c]) {
bfs(grid, new int[]{r, c});
ret++;
}
}
return ret;
}
private void bfs(boolean[][] grid, int[] cord) {
int r = cord[0], c = cord[1];
int R = grid.length, C = grid[0].length;
// 把bfs入口的点设为false
grid[r][c] = false;
Deque<int[]> queue = new LinkedList<>();
queue.addFirst(cord);
// 下面两个分别代表下左上右四个点的坐标偏移量
int[] rdir = new int[]{-1, 0, 1, 0};
int[] cdir = new int[]{0, -1, 0, 1};
while (! queue.isEmpty()) {
cord = queue.removeLast();
r = cord[0];
c = cord[1];
for (int i = 0; i < 4; ++i) {
int m = r + rdir[i];
int n = c + cdir[i];
if (m >= 0 && m < R && n >= 0 && n < C) {
if (! grid[m][n]) continue;
grid[m][n] = false;
queue.addFirst(new int[]{m, n});
}
}
}
}
}class Solution {
int dr[4] = {-1, 0, 1, 0};
int dc[4] = {0, -1, 0, 1};
void dfs(vector<vector<char>>& grid, int r, int c) {
grid[r][c] = '0';
for (int i = 0; i < 4; ++i) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nr >= grid.size() || nc < 0 || nc >= grid[0].size()) {
continue;
}
if (grid[nr][nc] == '1') {
dfs(grid, nr, nc);
}
}
}
public:
int numIslands(vector<vector<char>>& grid) {
int ret = 0;
for (int r = 0; r < grid.size(); ++r) {
for (int c = 0; c < grid[0].size(); ++c) {
if (grid[r][c] == '1') {
ret++;
dfs(grid, r, c);
}
}
}
return ret;
}
};