当前位置: 面试刷题>> 最大连通面积 (经典算法题500道)
### 题目描述补充
题目:**最大连通面积**
给定一个二维网格(矩阵),其中的每个单元格可以是`1`(表示土地)或`0`(表示水域)。土地单元格与其上下左右相邻的同为土地的单元格被视为连通的。要求编写一个算法,找出网格中所有土地单元格形成的最大连通区域的面积,并返回该面积。
### 示例
输入网格:
```
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 1 1 1
```
输出:4(最大连通区域的面积为4)
### 解题思路
这个问题可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。算法的基本思想是遍历整个网格,每当遇到一个值为`1`的单元格时,就启动一次搜索,计算当前连通区域的面积,并更新最大面积。为了避免重复计算,可以将已访问过的土地单元格标记为已访问(例如,将值改为另一个非`0`非`1`的值)。
### PHP 示例代码
```php
function maxAreaOfIsland($grid) {
$rows = count($grid);
if ($rows == 0) return 0;
$cols = count($grid[0]);
$maxArea = 0;
function dfs(&$grid, $row, $col, $rows, $cols) {
if ($row < 0 || $row >= $rows || $col < 0 || $col >= $cols || $grid[$row][$col] != 1) {
return 0;
}
$grid[$row][$col] = -1; // 标记为已访问
$area = 1;
$area += dfs($grid, $row - 1, $col, $rows, $cols); // 上
$area += dfs($grid, $row + 1, $col, $rows, $cols); // 下
$area += dfs($grid, $row, $col - 1, $rows, $cols); // 左
$area += dfs($grid, $row, $col + 1, $rows, $cols); // 右
return $area;
}
for ($i = 0; $i < $rows; $i++) {
for ($j = 0; $j < $cols; $j++) {
if ($grid[$i][$j] == 1) {
$maxArea = max($maxArea, dfs($grid, $i, $j, $rows, $cols));
}
}
}
return $maxArea;
}
```
### Python 示例代码
```python
def maxAreaOfIsland(grid):
if not grid:
return 0
rows, cols = len(grid), len(grid[0])
max_area = 0
def dfs(row, col):
nonlocal max_area
if row < 0 or row >= rows or col < 0 or col >= cols or grid[row][col] != 1:
return 0
grid[row][col] = 0 # 标记为已访问
area = 1
area += dfs(row - 1, col) # 上
area += dfs(row + 1, col) # 下
area += dfs(row, col - 1) # 左
area += dfs(row, col + 1) # 右
return area
for i in range(rows):
for j in range(cols):
if grid[i][j] == 1:
max_area = max(max_area, dfs(i, j))
return max_area
```
### JavaScript 示例代码
```javascript
function maxAreaOfIsland(grid) {
if (!grid.length) return 0;
const rows = grid.length;
const cols = grid[0].length;
let maxArea = 0;
function dfs(row, col) {
if (row < 0 || row >= rows || col < 0 || col >= cols || grid[row][col] !== 1) {
return 0;
}
grid[row][col] = -1; // 标记为已访问
let area = 1;
area += dfs(row - 1, col); // 上
area += dfs(row + 1, col); // 下
area += dfs(row, col - 1); // 左
area += dfs(row, col + 1); // 右
return area;
}
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
if (grid[i][j] === 1) {
maxArea = Math.max(maxArea, dfs(i, j));
}
}
}
return maxArea;
}
```
**码小课**网站中有更多相关内容分享给大家学习,涵盖了算法、数据结构、编程技巧等多个方面,欢迎访问学习。