1 是陆地, 0 是水, 只考虑上下左右四个方向相邻
例如:
输入:
11110
11010
11000
00000
输出: 1
思路: 遍历二维数组, 如果是 1, 就把它上下左右都感染为 0, 岛屿个数 +1
遍历完成, 最后返回岛屿个数 (感染的时候可以用递归)
class Solution {
public:
int numIslands(vector>& grid) {
int h = (int)grid.size();
if(h == 0) return 0;
int w = (int)grid[0].size();
int count = 0;
int i, j;
for(i=0; i>& grid, int i, int j, int w, int h)
{
if(i < 0 || i >= h || j < 0 || j >= w || grid[i][j] != '1')
return ;
grid[i][j] = '0';
infect(grid, i-1, j, w, h);
infect(grid, i+1, j, w, h);
infect(grid, i, j-1, w, h);
infect(grid, i, j+1, w, h);
}
};
class Solution {
public:
int maxAreaOfIsland(vector>& grid) {
int row = grid.size();
if(row == 0)
return 0;
int col = grid[0].size();
int max_num = 0;
for(int i=0; i >& grid, int i, int j, int row, int col) {
if(i >= 0 && i < row && j >= 0 && j < col && grid[i][j] == 1) {
grid[i][j] = 0;
return 1 + dfs(grid, i-1, j, row, col)
+ dfs(grid, i+1, j, row, col)
+ dfs(grid, i, j-1, row, col)
+ dfs(grid, i, j+1, row, col);
}
return 0;
}
};
[[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]]
答案: 16 解释: 它的周长是下面图片中的 16 个黄色的边:
4+4+(4-2-2)+(4-2)+(4-2)+4+(4-2-2)=16
对于最左边的cell, 因为一上来就是+4, 所以代表把整个这一行的变成都算进去了。
接下来对不是最左边的cell,因为只可能贡献上下的cell了,所以-2(左右两条边不会有用了),然后再考虑上下,如果不是最上面的cell, 那么说明上下的边也不会贡献出来做为边界,从而再-2.
int islandPerimeter(vector>& grid) {
int row = grid.size();
if(row == 0)
return 0;
int col = grid[0].size();
int count = 0;
for(int i=0; i 0 && grid[i-1][j] == 1)
count -= 2;
//如果是左边的cell
if(j > 0 && grid[i][j-1] == 1)
count -= 2;
return count;
其他链接:
LeetCode刷题—岛屿问题_RuiW_97的博客-CSDN博客_leetcode 岛屿问题