题目来源于力扣(LeetCode)
一、题目
题目相关标签:哈希表
二、解题思路
-
遍历数组,对于数组中为 1 的元素,直接加上全部的 4 条边,即周长为 4
-
在出现元素 1 的基础上,再判断其左边(即前一位元素)与其上面(即前一数组的相同索引)的元素是否也等于 1
-
其相邻元素也相等 1 时,需要进行减边的操作
-
两个陆地的相邻时,需要在两个周长为 4 的结果中再减 2,因为相邻的两个陆地的两条邻接线是不需要的,即不计算其周长
三、代码实现
public static int islandPerimeter(int[][] grid) {
// 排除特殊情况
if (grid == null || grid.length == 0) {
return 0;
}
// 记录周长,即多少条边
int count = 0;
// 遍历二维数组
for (int i = 0; i < grid.length; i++) {
int[] arr = grid[0];
for (int j = 0; j < arr.length; j++) {
// 元素为 1 时,说明为一个“陆地”
if (grid[i][j] == 1) {
// 一块陆地最多有 4 个边,即周长为 4
count += 4;
// 同水平线上左边有 “陆地” 时,减两条边:格子自身的左侧边和左边格子的右侧边
if (i > 0 && grid[i - 1][j] == 1) {
count -= 2;
}
// 同垂直线上上面有 “陆地” 时,减两条边:格子自身的上侧边和上面格子的下面边
if (j > 0 && grid[i][j - 1] == 1) {
count -= 2;
}
}
}
}
return count;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
int[][] grid = {{0, 1, 0, 0},
{1, 1, 1, 0},
{0, 1, 0, 0},
{1, 1, 0, 0}}; // output:16
int result = islandPerimeter(grid);
System.out.println(result);
}