岛屿个数问题
1 是陆地, 0 是水, 只考虑上下左右四个方向相邻
例如:
输入:
11110
11010
11000
00000
输出: 1
思路: 遍历二维数组, 如果是 1, 就把它上下左右都感染为 2, 岛屿个数 +1
遍历完成, 最后返回岛屿个数
感染的时候可以用递归
class Solution {
public:
int numIslands(vector<vector<char>>& 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<h; i++)
{
for(j=0; j<w; j++)
{
if(grid[i][j] == '1')
{
count++;
infect(grid, i, j, w, h);
}
}
}
return count;
}
void infect(vector<vector<char>>& 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<vector<int>>& grid) {
int row = grid.size();
if(row == 0)
return 0;
int col = grid[0].size();
int max_num = 0;
for(int i=0; i<row; i++) {
for(int j=0; j<col; j++) {
if(grid[i][j] == 1) {
max_num = max(max_num, dfs(grid, i, j, row, col));
}
}
}
return max_num;
}
int dfs(vector< vector<int> >& 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 个黄色的边:
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int row = grid.size();
if(row == 0)
return 0;
int col = grid[0].size();
int count = 0;
for(int i=0; i<row; i++)
{
for(int j=0; j<col; 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;
}
};
结合版, 同时求岛屿个数和最大岛屿面积
class Solution {
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
int h = (int)grid.size();
if(h == 0)
return 0;
int w = (int)grid[0].size();
int count = 0;
int max = 0;
int i, j;
for(i=0; i<h; i++)
{
for(j=0; j<w; j++)
{
if(grid[i][j] == 1)
{
count++;
int tmp = infect(grid, i, j, w, h);
if(tmp > max)
max = tmp;
}
}
}
cout << count << "," << max << endl;
}
int infect(vector<vector<int>>& grid, int i, int j, int w, int h)
{
if(i < 0 || i >= h || j < 0 || j >= w || grid[i][j] != 1)
return 0;
grid[i][j] = 0;
return 1 + 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);
}
};