Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
bb5c72f
0004_Solved
WAcry May 9, 2020
1d540ec
Rename 0004-median-of-two-sorted-arrays to 0004-median-of-two-sorted-…
WAcry May 9, 2020
0a528f2
0004_Solved
WAcry May 9, 2020
58d4e87
Merge pull request #85 from chilimyan/master
MisterBooo May 9, 2020
bcacf82
0004_Solved
WAcry May 9, 2020
74f1537
0004_Solved
WAcry May 9, 2020
76b7c5f
Merge pull request #86 from freetreer/master
MisterBooo May 9, 2020
938f18f
0025 Solved
anomot May 9, 2020
7ee0923
695
nettee May 9, 2020
1c55e0b
Solve 0137
peteryuhang May 9, 2020
5984175
Fix name typo
peteryuhang May 9, 2020
7163aaf
solved @xiaoshuai96
xiaoshuai96 May 10, 2020
1882475
Merge pull request #87 from anomot/master
MisterBooo May 11, 2020
c6ab9a2
Merge pull request #88 from nettee/695
MisterBooo May 11, 2020
cca9325
Merge pull request #89 from peteryuhang/master
MisterBooo May 11, 2020
9c0eb9d
Merge pull request #90 from xiaoshuai96/master
MisterBooo May 11, 2020
55ec12a
替换坏的gif
xiaoshuai96 May 11, 2020
b54bba9
0530 solved
zzilcc May 12, 2020
4f4ed06
add default return value to Two-Sum solution
underspirit May 13, 2020
0e9512c
Merge pull request #91 from xiaoshuai96/master
MisterBooo May 14, 2020
3302fb3
Merge pull request #92 from zzilcc/master
MisterBooo May 14, 2020
0a7cbf6
Solved 0260
peteryuhang May 17, 2020
1ce488f
solved @xiaoshuai96
xiaoshuai96 May 17, 2020
8989334
Merge pull request #93 from underspirit/bugfix-1
MisterBooo May 18, 2020
26d9265
Merge pull request #94 from peteryuhang/master
MisterBooo May 18, 2020
74af9ba
Merge pull request #95 from xiaoshuai96/master
MisterBooo May 18, 2020
566bcae
Solved 0120
peteryuhang May 23, 2020
62bcddc
Merge pull request #97 from peteryuhang/master
MisterBooo May 26, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added 0695-Max-Area-of-Island/Animation/Animation.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added 0695-Max-Area-of-Island/Animation/Animation.m4v
Binary file not shown.
173 changes: 173 additions & 0 deletions 0695-Max-Area-of-Island/Article/0695-Max-Area-of-Island.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
# LeetCode 图解 |

> 本文首发于公众号「图解面试算法」,是 [图解 LeetCode](<https://github.com/MisterBooo/LeetCodeAnimation>) 系列文章之一。
>
> 同步博客:https://www.algomooc.com

本题解作者:nettee

## 题目描述

给定一个包含了一些 `0` 和 `1` 的非空二维数组 `grid`。

一个**岛屿**是由一些相邻的 `1` (代表土地) 构成的组合,这里的「相邻」要求两个 `1` 必须在水平或者竖直方向上相邻。你可以假设 `grid` 的四个边缘都被 `0`(代表水)包围着。

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 `0`。)

**示例 1:**

```
[[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。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 `1` 。

**示例 2:**

```
[[0,0,0,0,0,0,0,0]]
```


对于上面这个给定的矩阵, 返回 0。

注意: 给定的矩阵 `grid` 的长度和宽度都不超过 50。

## 题目解析

这道题的主要思路是深度优先搜索。每次走到一个是 1 的格子,就搜索整个岛屿,并计算当前岛屿的面积。最后返回岛屿面积的最大值。

网格可以看成是一个无向图的结构,每个格子和它上下左右的四个格子相邻。如果四个相邻的格子坐标合法,且是陆地,就可以继续搜索。

在深度优先搜索的时候要注意避免重复遍历。我们可以把已经遍历过的陆地改成 2,这样遇到 2 我们就知道已经遍历过这个格子了,不进行重复遍历。

## 动画理解

![](../Animation/Animation.gif)

## 参考代码

C++ 代码:

```C++
class Solution {
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
int res = 0;
for (int r = 0; r < grid.size(); r++) {
for (int c = 0; c < grid[0].size(); c++) {
if (grid[r][c] == 1) {
int a = area(grid, r, c);
res = max(res, a);
}
}
}
return res;
}

int area(vector<vector<int>>& grid, int r, int c) {
if (!(inArea(grid, r, c))) {
return 0;
}
if (grid[r][c] != 1) {
return 0;
}
grid[r][c] = 2;

return 1
+ area(grid, r - 1, c)
+ area(grid, r + 1, c)
+ area(grid, r, c - 1)
+ area(grid, r, c + 1);
}

bool inArea(vector<vector<int>>& grid, int r, int c) {
return 0 <= r && r < grid.size()
&& 0 <= c && c < grid[0].size();
}
};
```

Java 代码:

```Java
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int res = 0;
for (int r = 0; r < grid.length; r++) {
for (int c = 0; c < grid[0].length; c++) {
if (grid[r][c] == 1) {
int a = area(grid, r, c);
res = Math.max(res, a);
}
}
}
return res;
}

int area(int[][] grid, int r, int c) {
if (!inArea(grid, r, c)) {
return 0;
}
if (grid[r][c] != 1) {
return 0;
}
grid[r][c] = 2;

return 1
+ area(grid, r - 1, c)
+ area(grid, r + 1, c)
+ area(grid, r, c - 1)
+ area(grid, r, c + 1);
}

boolean inArea(int[][] grid, int r, int c) {
return 0 <= r && r < grid.length
&& 0 <= c && c < grid[0].length;
}
}
```

Python 代码:

```Python
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
res = 0
for r in range(len(grid)):
for c in range(len(grid[0])):
if grid[r][c] == 1:
a = self.area(grid, r, c)
res = max(res, a)
return res

def area(self, grid: List[List[int]], r: int, c: int) -> int:
if not self.inArea(grid, r, c):
return 0
if grid[r][c] != 1:
return 0
grid[r][c] = 2

return 1 \
+ self.area(grid, r - 1, c) \
+ self.area(grid, r + 1, c) \
+ self.area(grid, r, c - 1) \
+ self.area(grid, r, c + 1)

def inArea(self, grid: List[List[int]], r: int, c: int) -> bool:
return 0 <= r < len(grid) and 0 <= c < len(grid[0])
```



## 复杂度分析

设网格的边长为 n,则时间复杂度为 O(n²)。