200. Number of Islands

这个题一上来傻了。。
其实就一点,一个格只能被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);
    }
}
原文地址:https://www.cnblogs.com/reboot329/p/6053020.html