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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值