Input: grid = [ ["1","1","0","0","0"], ["1","1","0","0","0"], ["0","0","1","0","0"], ["0","0","0","1","1"] ] Output: 3题目大意:1代表土地,0代表水,一个岛屿是由四面环水的土地组成,求岛屿的数量。如上例中含3个岛屿。
解题思路:
典型的回溯法(DFS)求解。
DFS逻辑:目的是搜索完某个岛屿所有为1的所有区域。访问标志visited[i][j]设为true,再对grid[i][j]的上下左右区域进行递归
DFS结束条件:遇到0或者超出边界
C++
class Solution {
public:
int result = 0;
int m, n;
vector<vector<bool>> visited;
void DFS(int i, int j, vector<vector<char>>& grid){
if(i >= 0 && j >= 0 && i < m && j < n && !visited[i][j] && grid[i][j] == '1'){
visited[i][j] = true;
DFS(i - 1, j, grid);
DFS(i + 1, j, grid);
DFS(i, j + 1, grid);
DFS(i, j - 1, grid);
}
}
void init(){
for(int i = 0;i < m;i++){
visited.push_back(vector<bool>(n, false));
}
}
int numIslands(vector<vector<char>>& grid) {
if(grid.size() == 0 || grid[0].size() == 0){
return 0;
}
m = grid.size();
n = grid[0].size();
init();
for(int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
if(!visited[i][j] && grid[i][j] == '1'){
//找到一个岛屿,并搜索完该岛屿所有区域,岛屿数量增加
DFS(i, j, grid);
result++;
}
}
}
return result;
}
};
Java
class Solution {
int m, n;
int result = 0;
boolean[][] visited;
void DFS(int i, int j, char[][] grid){
if(i >= 0 && j >= 0 && i < m && j < n && !visited[i][j] && grid[i][j] == '1'){
visited[i][j] = true;
DFS(i - 1, j, grid);
DFS(i + 1, j, grid);
DFS(i, j + 1, grid);
DFS(i, j - 1, grid);
}
}
public int numIslands(char[][] grid) {
if(grid.length == 0 || grid[0].length == 0){
return 0;
}
m = grid.length;
n = grid[0].length;
visited = new boolean[m][n];
for(int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
if(!visited[i][j] && grid[i][j] == '1'){
DFS(i, j, grid);
result++;
}
}
}
return result;
}
}
本小白华中科技大学在读研究生,自然语言处理方向。现每日一更LeetCode Top 100 Liked Questions, 旨在于通过通俗易懂的画风和诸位计算机朋友们一起成长呀,不局限某题,争取举一反三,所有Questions均呈上C++和Java解法,不足之处多多指正,共同学习。