给一个布尔类型的二维数组, 0 表示海, 1 表示岛。如果两个1是相邻的,那么我们认为他们是同一个岛.我们只考虑 上下左右 相邻.
找到大小在 k 及 k 以上的岛屿的数量
样例:
给一个二维数组:
[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]
]
给出 K = 2
返回 2
思路:
DFS,递归,求出每个大岛的数目。使用额外的空间会报错,
故在grid上直接判断,修改。
#ifndef C677_H
#define C677_H
#include<iostream>
#include<vector>
#include<map>
using namespace std;
class Solution {
public:
/*
* @param : a 2d boolean array
* @param : an integer
* @return: the number of Islands
*/
int numsofIsland(vector<vector<bool>> grid, int k) {
// Write your code here
if (grid.empty()||grid[0].empty())
return 0;
int num = 0;
int row = grid.size();
int col = grid[0].size();
vector<vector<int>> dic{ { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };//为了方便计算上下左右四个位置
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
if (grid[i][j])
{
int cnt = helper(grid, i, j, dic);
if (cnt>0 && cnt >= k)
num++;
}
}
}
return num;
}
//对于grid[i][j],若grid[i][j]==1,为防止重复计算,更改其值为false,
//并递归求出与grid[i][j]相邻的满足条件的点,计算其个数
int helper(vector<vector<bool>> &grid, int i, int j,vector<vector<int>> dic)
{
int row = grid.size();
int col = grid[0].size();
int num = 0;
if (i < 0 || j < 0 || i >= row || j >= col)
return 0;
int pos = i*col + j;
if (grid[i][j])
{
num++;
grid[i][j]=false;
for (auto c : dic)
{
int x = i + c[0];
int y = j + c[1];
num+=helper(grid, x, y, dic);
}
return num;
}
else
return 0;
}
};
#endif