題目來(lái)源
一道簡(jiǎn)單題,我竟然做了半個(gè)多小時(shí),用的最笨的方法。
先找到一塊陸地,然后在深度優(yōu)先遍歷,計(jì)算。
我一開(kāi)始沒(méi)有想到邊界上的邊也算邊,然后耽誤了一些時(shí)間。
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;
}
};
看了看提示,說(shuō)用哈希,不過(guò)沒(méi)想到應(yīng)該怎么用。然后看了下討論,發(fā)現(xiàn)了一個(gè)好idea。就是遍歷,計(jì)算有多少塊陸地,然后對(duì)于每塊陸地,看看他的右邊和下邊是否是陸地,是的話就減去兩條邊,否則的話就是四條邊。
代碼如下:
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;
}
};