这个题一上来傻了。。
其实就一点,一个格只能被1个岛用,如果被用了,把它换成0就行了。
一开始把重心放在省时间,其实省不了,还往接水啊,最大矩形上想。。
老老实实遍历就完了。。
public int numIslands(char[][] grid) {
int row = grid.length;
if(row == 0) return 0;
int col = grid[0].length;
//System.out.println(row);
//System.out.println(col);
int res = 0;
for(int m = 0; m < row; m++)
{
for(int n = 0; n < col;n++)
{
if(grid[m][n] == '0')
{
}
else
{
res++;
turn(m,n,grid);
}
}
}
return res;
}
public void turn(int m,int n, char[][] grid)
{
if(grid[m][n] == '0' || m < 0 ||)
if(grid[m][n] == '1')
{
grid[m][n] = '0';
if(m > 0) turn(m-1,n,grid);
if(n > 0) turn(m,n-1,grid);
if(m < grid.length-1) turn(m+1,n,grid);
if(n < grid[0].length-1) turn(m,n+1,grid);
return;
}
else
{
return;
}
}
with extra n² space,能减少一些运算。。不过意义不大。。
二刷。
一句话,一个格只能被一个岛使用,被统计过就变成0就行了。变的时候往4个方向判断一下再变。
public class Solution {
public int numIslands(char[][] grid)
{
int res = 0;
for(int i = 0 ; i < grid.length;i++)
{
for(int j = 0; j<grid[0].length;j++)
{
if(grid[i][j] == '1')
{
res++;
turn(grid,i,j);
}
}
}
return res;
}
public void turn(char[][] grid, int i, int j)
{
grid[i][j] = '0';
if(i > 0 && grid[i-1][j] == '1') turn(grid,i-1,j);
if(j > 0 && grid[i][j-1] == '1') turn(grid,i,j-1);
if(i < grid.length-1 && grid[i+1][j] == '1') turn(grid,i+1,j);
if(j < grid[0].length-1 && grid[i][j+1] == '1') turn(grid,i,j+1);
}
}
三刷。
标准的2D里的DFS。。
还是DFS开始判断边界问题,可以让代码简洁。
Time: O(mn) 每个格最多来一遍。。
Space: O(1)
public class Solution {
public int numIslands(char[][] grid) {
if (grid.length == 0) return 0;
int res = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == '1') {
res++;
dfs(grid, i, j);
}
}
}
return res;
}
public void dfs(char[][] grid, int m, int n) {
if (m < 0 || m >= grid.length || n < 0 || n >= grid[0].length || grid[m][n] != '1') return;
grid[m][n] = '0';
dfs(grid, m+1, n);
dfs(grid, m-1, n);
dfs(grid, m, n+1);
dfs(grid, m, n-1);
}
}