99 lines
3.0 KiB
Markdown
99 lines
3.0 KiB
Markdown
|
||
## 题目链接
|
||
https://leetcode-cn.com/problems/island-perimeter/
|
||
|
||
## 思路
|
||
|
||
岛屿问题最容易让人想到BFS或者DFS,但是这道题还真的没有必要,别把简单问题搞复杂了。
|
||
|
||
### 解法一:
|
||
|
||
遍历每一个空格,遇到岛屿,计算其上下左右的情况,遇到水域或者出界的情况,就可以计算边了。
|
||
|
||
如图:
|
||
|
||
<img src='https://code-thinking.cdn.bcebos.com/pics/463.岛屿的周长.png' width=600> </img></div>
|
||
|
||
C++代码如下:(详细注释)
|
||
|
||
```C++
|
||
class Solution {
|
||
public:
|
||
int direction[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
|
||
int islandPerimeter(vector<vector<int>>& grid) {
|
||
int result = 0;
|
||
for (int i = 0; i < grid.size(); i++) {
|
||
for (int j = 0; j < grid[0].size(); j++) {
|
||
if (grid[i][j] == 1) {
|
||
for (int k = 0; k < 4; k++) { // 上下左右四个方向
|
||
int x = i + direction[k][0];
|
||
int y = j + direction[k][1]; // 计算周边坐标x,y
|
||
if (x < 0 // i在边界上
|
||
|| x >= grid.size() // i在边界上
|
||
|| y < 0 // j在边界上
|
||
|| y >= grid[0].size() // j在边界上
|
||
|| grid[x][y] == 0) { // x,y位置是水域
|
||
result++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
};
|
||
```
|
||
|
||
### 解法二:
|
||
|
||
计算出总的岛屿数量,因为有一对相邻两个陆地,边的总数就减2,那么在计算出相邻岛屿的数量就可以了。
|
||
|
||
result = 岛屿数量 * 4 - cover * 2;
|
||
|
||
如图:
|
||
|
||
<img src='https://code-thinking.cdn.bcebos.com/pics/463.岛屿的周长1.png' width=600> </img></div>
|
||
|
||
C++代码如下:(详细注释)
|
||
|
||
```C++
|
||
class Solution {
|
||
public:
|
||
int islandPerimeter(vector<vector<int>>& grid) {
|
||
int sum = 0; // 陆地数量
|
||
int cover = 0; // 相邻数量
|
||
for (int i = 0; i < grid.size(); i++) {
|
||
for (int j = 0; j < grid[0].size(); j++) {
|
||
if (grid[i][j] == 1) {
|
||
sum++;
|
||
// 统计上边相邻陆地
|
||
if(i - 1 >= 0 && grid[i - 1][j] == 1) cover++;
|
||
// 统计左边相邻陆地
|
||
if(j - 1 >= 0 && grid[i][j - 1] == 1) cover++;
|
||
// 为什么没统计下边和右边? 因为避免重复计算
|
||
}
|
||
}
|
||
}
|
||
return sum * 4 - cover * 2;
|
||
}
|
||
};
|
||
```
|
||
|
||
|
||
## 其他语言版本
|
||
|
||
Java:
|
||
|
||
Python:
|
||
|
||
Go:
|
||
|
||
JavaScript:
|
||
|
||
|
||
-----------------------
|
||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
|
||
* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
|
||
<div align="center"><img src=../pics/公众号.png width=450 alt=> </img></div>
|