leetcode 200. 岛屿数量
题目详情
题目链接
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
- 示例 1:
输入:
11110
11010
11000
00000
输出: 1- 示例 2:
输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
我的代码
class Solution {
public:
int row, col;
vector<vector<char>> lands;
void findLand(int i, int j) {
if (lands[i][j] == '1') {
lands[i][j] = '0';
if (i > 0) {
findLand(i - 1, j);
}
if (i + 1 < row) {
findLand(i + 1, j);
}
if (j > 0) {
findLand(i, j - 1);
}
if (j + 1 < col) {
findLand(i, j + 1);
}
}
}
int numIslands(vector<vector<char>>& grid) {
row = grid.size();
if (row == 0) {
return 0;
}
col = grid[0].size();
lands = grid;
int res = 0;
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
if (lands[i][j] == '1') {
findLand(i, j);
++res;
}
}
}
return res;
}
};
我的成绩
执行结果:通过
执行用时 : 12 ms, 在所有 C++ 提交中击败了86.76%的用户
内存消耗 : 8.8 MB, 在所有 C++ 提交中击败了100.00%的用户
一些想法
感觉自己之前做过类似的题。本道题很简单,我们遍历网格,遇到陆地(即‘1’),则通过递归,对相邻的陆地进行置‘0’操作,即可找到对应岛屿,岛屿数量加一。
执行用时为 0 ms 的范例
class Solution {
public:
int row=0;
int col=0;
int numIslands(vector<vector<char>>& grid) {
int ret=0;
row=grid.size();
if(row==0)
{
return 0;
}
col=grid[0].size();
if(col==0)
{
return 0;
}
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(1==dfs(i,j,grid))
{
ret++;
}
}
}
return ret;
}
int dfs(int x,int y,vector<vector<char>>& grid)
{
if(grid[x][y]=='0')
{
return 0;
}
grid[x][y]='0';
if(x+1<row)
{
dfs(x+1,y,grid);
}
if(y+1<col)
{
dfs(x,y+1,grid);
}
if(x-1>=0)
{
dfs(x-1,y,grid);
}
if(y-1>=0)
{
dfs(x,y-1,grid);
}
return 1;
}
};
思考
范例做法和我相同。