天天看点

leetcode 695. Max Area of Island(深搜)

题目的目的是求岛屿的最大面积。首先我们需要知道什么叫岛屿,这里的岛屿指的是数组中上下左右相连1的总数。即只要在这四个方向上有1相连接,就计入该岛屿面积。

解题思路:看到这种有条件查询问题(本题是在找到1的基础上向四个方向继续找1),可以想到深度搜索法。为了减少查询次数,我们先搜索整个二维数组,找到1再进行递归查询。

注意点:1.可设置两个数组来实现四个方向的查询;2.对应查询过的1,一定要将其标记为0,防止二次查询;3.查询的边界条件;

代码如下:

代码1:

class Solution {

      int value=0;

      int max_value=0;

      int h[]={-1,1,0,0};

      int l[]={0,0,-1,1};

    public int maxAreaOfIsland(int[][] grid) {

        int h1=grid.length;

        int l1=grid[0].length;    

        for(int i=0;i<h1;i++)

        {

            for(int j=0;j<l1;j++)

            {

                if(grid[i][j]==1)

                   des(i,j,grid);

                if(value>max_value)

                {

                    max_value=value;

                }

                value=0;

            }

        }

        return max_value;          

    }

    void des(int x,int y,int[][] grid){

        value++;                                                                               //每一次进入递归都要做的事

        grid[x][y]=0;

        for(int i=0;i<4;i++)

        {

            x+=h[i];                                                                            //状态转移

            y+=l[i];

            if(x>=0&&y>=0&&x<grid.length&&y<grid[0].length)//转移状态后,判断继续递归的条件,也可以放在函数开始处,每进入函数就先判断能不能继续往下做。

            {

                if(grid[x][y]==1){

                    des(x,y,grid);

                }  

            }

            x-=h[i];                                                                           //不满足递归条件后,回溯到上一状态

            y-=l[i];

        }

    }      //所有状态都遍历完成后,函数任务结束。可以假设进入递归后,不满足进一步递归的条件,看函数能不能顺利结束。

}

代码2:

class Solution {

    public int maxAreaOfIsland(int[][] grid) {

        int max_area=0;

        for(int i=0;i<grid.length;i++)

        {

            for(int j=0;j<grid[0].length;j++)

            {

                if(grid[i][j]==1)

                max_area = Math.max(max_area, dfs(grid, i, j));

            }

        }

        return max_area;

    }

    public int dfs(int [][]a,int i,int j)

    {

         if( i < 0 || i >= a.length || j < 0 || j >= a[0].length || a[i][j] == 0)

            return 0;

        int result=1;

        a[i][j]=0;//防止二次搜索

        result+=dfs(a,i-1,j)+dfs(a,i+1,j)+dfs(a,i,j-1)+dfs(a,i,j+1);

        return result;

    }

}