思路挺简单的就是找规律,遍历每个点,如果这个点是1的话默认它有四条边,但是如果有一个相邻的1就少一条边。常数向量pq是上下左右四个相邻点的坐标位移。
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int m = grid.size();
int n;
if (m != 0) n = grid[0].size(); else n = 0;
vector<int>p = { -1, 0, 0, 1 };
vector<int>q = { 0, -1, 1, 0 };
int i,j;
int count = 0;
for (i=0; i < m ; i++)
for (j=0; j < n ; j++)
{
if (grid[i][j] == 0) continue;
count = count + 4;
for (int k = 0; k < 4; k++)
if ((i + p[k]>=0) && (i + p[k] < m) && (j + q[k]>=0) && (j + q[k] < n))
if (grid[i + p[k]][j + q[k]] == 1) count = count - 1;
}
return count;
}
};
最优解思路:
和我的差不多,但是他的算法是只数左边和上边的重复数,然后把这个重复数*2就是所有的重复数,比我的算法少检测一半的相邻点,快一些。
int islandPerimeter(vector<vector<int>>& grid) {
int count=0, repeat=0;
for(int i=0;i<grid.size();i++)
{
for(int j=0; j<grid[i].size();j++)
{
if(grid[i][j]==1)
{
count ++;
if(i!=0 && grid[i-1][j] == 1) repeat++;
if(j!=0 && grid[i][j-1] == 1) repeat++;
}
}
}
return 4*count-repeat*2;
}