题目地址:
https://leetcode.com/problems/island-perimeter/
给定一个二维矩阵,只含 0 0 0和 1 1 1。一片连通的 1 1 1是一个岛屿,题目确保只有一个连通块,并且该连通块是单连通的。问这个岛的周长是多少。
只需统计一下每个 1 1 1的邻居有多少个即可,有 k k k个邻居的 1 1 1能贡献 4 − k 4-k 4−k长度的周长。最后累加起来即可。代码如下:
class Solution {
public:
int islandPerimeter(vector<vector<int>>& g) {
int f[5] = {0};
auto in_bound = [&](int x, int y) {
return 0 <= x && x < g.size() && 0 <= y && y < g[0].size();
};
for (int i = 0; i < g.size(); i++)
for (int j = 0; j < g[0].size(); j++)
if (g[i][j]) {
int cnt = 0;
for (int di = -1; di <= 1; di++)
for (int dj = -1; dj <= 1; dj++)
if (((!di && dj) || (di && !dj)) && in_bound(i + di, j + dj) &&
g[i + di][j + dj])
cnt++;
f[cnt]++;
}
int res = 0;
for (int i = 0; i <= 4; i++) res += f[i] * (4 - i);
return res;
}
};
时间复杂度 O ( n ) O(n) O(n), n n n为矩阵规模,空间 O ( 1 ) O(1) O(1)。