You are given a map in form of a two-dimensional integer gridwhere 1 represents land and 0 represents water. Grid cells are connectedhorizontally/vertically (not diagonally). The grid is completely surrounded bywater, and there is exactly one island (i.e., one or more connected landcells). The island doesn't have "lakes" (water inside that isn'tconnected to the water around the island). One cell is a square with sidelength 1. The grid is rectangular, width and height don't exceed 100. Determinethe perimeter of the island.
Example:
[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]]
![](https://img-blog.csdn.net/20180117132753898?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjczNzE5Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Answer: 16
Explanation: The perimeter is the 16 yellow stripes in the image below:
这题我原来考虑的是对于每个1,判断左右上下是0的格子的个数,这样无疑时间挺长的,后来看到了一个很好的方法,就是每发现一个值为1的格子,将边界数加4,然后没发现他与一个值为1的格子重合,边界数减2,这样就能够得到最后的边界数
这一题还可以改进,就是使用两个值a和b来分别统计格子总数和边界重合的总数,最后return a*4-2*b就能得到最后的结果,这一种方法比上面的好一倍以上我觉得是因为其使用的是++,而上一种使用的是+=4,-=2,++应该比+=4,+=2等要好很多,以后能使用++的地方尽量使用++!
通过这一题我还学会了假如使用格子把一个四连同区域完全包围起来,共需要多少个格子的方法,方法和上面的方法类似
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int r = grid.size();
int c = grid[0].size();
int count = 0;
for(int i=0;i<r;i++)
for (int j = 0; j < c; j++)
{
if (grid[i][j] == 1)
{
count += 4;
if (i > 0 && grid[i - 1][j] == 1) count -= 2;
if (j > 0 && grid[i][j - 1] == 1) count -= 2;
}
}
return count;
}
};