题目来源
一道简单题,我竟然做了半个多小时,用的最笨的方法。
先找到一块陆地,然后在深度优先遍历,计算。
我一开始没有想到边界上的边也算边,然后耽误了一些时间。
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int m = grid.size();
if (m == 0)
return 0;
int n = grid[0].size();
for (int i=0; i<m; i++)
for (int j=0; j<n; j++)
if (grid[i][j] == 1)
return dfs(grid, i, j);
return 0;
}
int dfs(vector<vector<int>>& grid, int x, int y)
{
int res = 0;
int a[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
grid[x][y] = -1;
for (int i=0; i<4; i++) {
int tmpx = x + a[i][0];
int tmpy = y + a[i][1];
if (tmpx == -1 || tmpx == grid.size() || tmpy == -1 || tmpy == grid[0].size() || grid[tmpx][tmpy] == 0)
res++;
if (tmpx >= 0 && tmpx < grid.size() && tmpy >= 0 && tmpy < grid[0].size() && grid[tmpx][tmpy] == 1)
res += dfs(grid, tmpx, tmpy);
}
return res;
}
};
看了看提示,说用哈希,不过没想到应该怎么用。然后看了下讨论,发现了一个好idea。就是遍历,计算有多少块陆地,然后对于每块陆地,看看他的右边和下边是否是陆地,是的话就减去两条边,否则的话就是四条边。
代码如下:
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int m = grid.size();
if (m == 0)
return 0;
int n = grid[0].size();
int island = 0;
int neighbor = 0;
for (int i=0; i<m; i++)
for (int j=0; j<n; j++)
if (grid[i][j] == 1) {
island++;
if (j+1<n && grid[i][j+1] == 1)
neighbor++;
if (i+1<m && grid[i+1][j] == 1)
neighbor++;
}
return island * 4 - neighbor * 2;
}
};