zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
  • 相关阅读:
    Java中线程池,你真的会用吗?ExecutorService ThreadPoolExcutor
    springcloud中微服务的优雅停机(已验证)
    SpringCloud eureka
    Spring Boot实战:静态资源处理
    你真的理解CountDownLatch与CyclicBarrier使用场景吗?
    Effective.Java第56-66条(规范相关)
    Effective.Java第45-55条(规范相关)
    Effective.Java第34-44条(枚举)
    装饰(Decorator)模式
    合成(Composite)模式
  • 原文地址:https://www.cnblogs.com/reboot329/p/6053020.html
Copyright © 2011-2022 走看看