LeetCode第200題孤島數量,題目地址。
題目描述:
給你一個由 '1'(陸地)和 '0'(水)組成的的二維網格,請你計算網格中島嶼的數量。
島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連接形成。
此外,你可以假設該網格的四條邊均被水包圍。
例子:
輸入:
11110
11010
11000
00000
輸出: 1
解題:DFS
分析根據題意,陸地連接方式:上下左右,錯對角不算連接。考慮將遍歷過的孤島元素(能連接上的島嶼)值設置爲0,避免二次遍歷。當然你也可以假設這個矩陣是int[][],不妨礙使用上述思路解決問題。
class Solution {
void dfs(char[][] grid, int r, int c) {
int nr = grid.length;
int nc = grid[0].length;
if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') {
return;
}
grid[r][c] = '0';
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
}
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int nr = grid.length;
int nc = grid[0].length;
int num_islands = 0;
for (int r = 0; r < nr; ++r) {
for (int c = 0; c < nc; ++c) {
if (grid[r][c] == '1') {
++num_islands;
dfs(grid, r, c);
}
}
}
return num_islands;
}
}
複雜度:
時間複雜度:O(MN),遍歷全部元素。
空間複雜度:O(1),需要存一些常量。
20200605D
島嶼的變種題
LeetCode第695題,島嶼的最大面積,題目地址。
題目描述:
給定一個包含了一些 0 和 1 的非空二維數組 grid 。
一個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裏的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0(代表水)包圍着。
找到給定的二維數組中最大的島嶼面積。(如果沒有島嶼,則返回面積爲 0 。)
例子:
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]
答案:6,島嶼只能包含垂直和水平方向。
解題:
分析:相比於上題,這裏的dfs函數需要有返回值,返回值表示島嶼的數量,也就是全連同的1的個數。
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int res = 0;
for (int i = 0; i < grid.length; i++){
for (int j = 0; j < grid[0].length; j++){
if (grid[i][j] == 1){
res = Math.max(res, dfs(i,j,grid));
}
}
}
return res;
}
public int dfs (int i, int j, int[][] grid){
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 0){
return 0;
}
grid[i][j] = 0;
int num = 1;//能進來,默認爲1,進來dfs的條件就是grid[i][j]=1
num += dfs(i+1,j, grid);
num += dfs(i-1,j, grid);
num += dfs(i,j+1, grid);
num += dfs(i,j-1, grid);
return num;
}
}
參考LeetCode:
孤島數量:https://leetcode-cn.com/problems/number-of-islands/
島嶼最大面積:https://leetcode-cn.com/problems/max-area-of-island