463. 岛屿的周长 dfs

该博客介绍了一个计算二维网格中岛屿周长的方法。通过深度优先搜索(DFS),当遇到陆地(值为1)时,向四个方向探索,遇到边界或水域(值为0)时增加周长计数。同时,已访问过的陆地会被标记为2,避免重复计算。最终返回累计的周长。博客还提到了在方法中使用数组而非基本类型来确保参数传递的正确性。
摘要由CSDN通过智能技术生成
463. 岛屿的周长

难度简单459

给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

示例 1:

img

输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是上面图片中的 16 个黄色的边

示例 2:

输入:grid = [[1]]
输出:4

示例 3:

输入:grid = [[1,0]]
输出:4

提示:

  • row == grid.length
  • col == grid[i].length
  • 1 <= row, col <= 100
  • grid[i][j]01

题解 :

注意这儿的周长的求法 : 就是遍历到一个 1 后 ,分别向4个方向dfs遍历 只要遇到出界了或者遇到 0 了 就对应了下图的黄线,这些不就构成周长了么 ,同时遍历过的1要将它设置为 2 ,并设置条件 遇到 2 后啥也不做直接返回 .

还有就是由于这里的sum作为存放一个数字 没有直接使用int类型 ,而是使用了数组形式 ,因为int基本类型进行的是值传递 , 形参的改变不会影响实参 , 所以只会返回初始值 0 ,改为数组就是一个引用了 ,引用传递也就是传地址 .方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

img*

class Solution {
    public int islandPerimeter(int[][] grid) {
       int[] sum=new int[]{0};
       for(int i = 0;i<grid.length;i++){
           for(int j=0;j<grid[0].length;j++){
               if(grid[i][j]==1){
                   dfs(grid,i,j,sum);
               }
           }
       }
       return sum[0] ;

    }
    void dfs(int[][] grid,int i,int j,int[] sum){
        int x = grid.length;
        int y = grid[0].length;
        
        if(i<0||i>=x||j<0||j>=y||grid[i][j]==0){ //只要是岛屿靠边了 或者与0的岛屿相接了直接加1
            sum[0]++;
            return;
        }
        if( grid[i][j]==2){ //到了已经遍历过的岛屿直接返回  因为岛屿与岛屿之间的边是不计入周长的
            return;
        }
       
        grid[i][j]=2;  //设置为2表示该岛屿已经遍历过
        dfs(grid,i-1,j,sum);//向下
        dfs(grid,i,j+1,sum);//向右
        dfs(grid,i+1,j,sum);//向上
        dfs(grid,i,j-1,sum);//向左
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值