Java解决岛屿周长问题
01 题目
给定一个 row x col
的二维网格地图 grid
,其中:grid[i][j] = 1
表示陆地, grid[i][j] = 0
表示水域。
网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
示例 1:
输入: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]
为0
或1
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;//当只有一格时,返回周长4return count;}for (int i = 0; i < row; i++) {//循环每一排boolean flag=false;//用于判断是否数组值为一,即满足第一条件for (int j = 0; j < col; j++) {//循环每列,默认初始每块小岛周长为4int 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--;}}}}//总周长加上该小岛周长,并把循环默认改为falseif (flag) {count+=bolder;flag=false;}}}return count;
}
}