Java解决岛屿周长问题

Java解决岛屿周长问题

01 题目

给定一个 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

02 知识点

  • 二维数组
  • DFS,遍历循环求解

03 我的题解

public class shuzu06 {
	public static void main(String[] args) {
        //测试数据
		int[][] grid=new int[][] {
			{0,1,0,0},
			{1,1,1,0},
			{0,1,0,0},
			{1,1,0,0}
		};
		System.out.println(numSpecial(grid));
	}
public static int numSpecial(int[][] grid) {
	int count=0;//用于记录周长
	int row = grid.length;//获取排数
	int col = grid[0].length;//获取列数
	if (row==1&&col==1) {
		count=4;//当只有一格时,返回周长4
		return count;
	}
	for (int i = 0; i < row; i++) {
        //循环每一排
		boolean flag=false;//用于判断是否数组值为一,即满足第一条件
		for (int j = 0; j < col; j++) {
            //循环每列,默认初始每块小岛周长为4
			int bolder=4;
			if (grid[i][j]==1) {
                //满足第一条件,执行第二语句
				flag=true;
			}
			if (flag) {
    //分两种情况讨论,周围两排是否有小岛和周围两列是否有小岛
				if (row>1) {
                    //当处于中间排而不是两边排时,判断两边是否有小岛,有则该小岛的周长减一
					if (i>0&&i<row-1) {
						if (grid[i-1][j]==1) {
							bolder--;
						}
						if (grid[i+1][j]==1) {
							bolder--;
						} //当处于两边排时,判断另边是否有小岛,有则该小岛的周长减一
					}else if (i==0) {
						if (grid[i+1][j]==1) {
							bolder--;
						}
					} else {
						if (grid[i-1][j]==1) {
							bolder--;
						}
					}		
				}
				//周围两列与周围两排原理相同
				if (col>1) {
					if (j>0&&j<col-1) {
						if (grid[i][j-1]==1) {
							bolder--;
						}
						if (grid[i][j+1]==1) {
							bolder--;
						}
					}else if (j==0) {
						if (grid[i][j+1]==1) {
							bolder--;
						}
					} else {
						if (grid[i][j-1]==1) {
							bolder--;
						}
					}
				}
				}
				//总周长加上该小岛周长,并把循环默认改为false
			if (flag) {
				count+=bolder;
				flag=false;
			}
		}
		}
	return count;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宣布无人罪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值