Leetcode2021.11.2

Leetcode2021.11.2

105. 岛屿的最大面积

难度中等585

给你一个大小为 m x n 的二进制矩阵 grid

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0

package offer;

public class offer105
{   int res=0;
    public int maxAreaOfIsland(int[][] grid) {

     for(int i=0;i<grid.length;i++)
     {
         for(int j=0;j<grid[0].length;j++)
         {   //如果当前值满足条件,是岛屿,进行遍历
             if(grid[i][j]==1)
                 //res是当前的连通区域内的岛屿数,然后与记录的最大值进行比较
                 res=Math.max(MaxArea(grid,i,j),res);
         }
     }
     return res;
    }
    //计算最大值
    public int MaxArea(int[][] grid, int i, int j)
    {   //如果遍历已经出去了整个二维数组,越界,应当返回
        if(!InArea(grid,i,j))
            return 0;
        //不等于1,两种情况,第一是当前不是岛屿,另一种是已经遍历过
        if(grid[i][j]!=1)
            return 0;
        //遍历过变成2,防止重复遍历
        grid[i][j]=2;
        //1+向四个方向进行的遍历
        return 1+MaxArea(grid,i-1,j)+MaxArea(grid,i+1,j)+MaxArea(grid,i,j+1)+MaxArea(grid,i,j-1);
    }
    //判定是否越界
    boolean InArea(int[][] grid, int i, int j)
    {
        if(i<0||j<0||i>=grid.length||j>=grid[0].length)
            return false;
        return true;
    }
}

剑指 Offer II 107. 矩阵中的距离

难度中等1

给定一个由 01 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。

两个相邻元素间的距离为 1

示例 1:

img


   class Solution {
   static int[][]dirs={{-1,0},{1,0},{0,-1},{0,1}};
    public int[][] updateMatrix(int[][] mat)
    {
        int m=mat.length,n=mat[0].length;
        int[][]dist=new int[m][n];
        boolean[][]seen=new boolean[m][n];
        Queue<int[]>queue=new LinkedList<int[]>();
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(mat[i][j]==0)
                {   //将所有0的位置添加进入队列
                    queue.add(new int[]{i,j});
                    //并将这些位置置为true
                    seen[i][j]=true;
                }
            }
        }
        //开始进行广度优先遍历
        while (!queue.isEmpty())
        {
            int[] cell=queue.poll();
            int i=cell[0],j=cell[1];
            for(int d=0;d<4;++d)
            {
                int ni=i+dirs[d][0];
                int nj=j+dirs[d][1];
                if(ni>=0&&ni<m&&nj>=0&&nj<n&&!seen[ni][nj])
                {
                    dist[ni][nj]=dist[i][j]+1;
                    queue.offer(new int[]{ni,nj});
                    seen[ni][nj]=true;
                }
            }
        }
        return dist;
    }}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值