岛屿数量
题意
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
输入:
11110
11010
11000
00000
输出: 1
解题思路
利用DFS遍历的方法,若格子为‘1’,那么遍历其四周的格子。每次遍历格子都把格子数值赋值为‘0’,避免重复遍历。
代码
class Solution(object):
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
def dfs(temp, r, c):
temp[r][c] = '0'
for x, y in [(r-1,c), (r+1, c), (r, c-1), (r, c+1)]:
if x > -1 and x < len(temp) and y > -1 and y < len(temp[0]) and temp[x][y]=='1':
dfs(temp, x, y)
nr = len(grid)
if nr == 0:
return 0
nc = len(grid[0])
res = 0
for r in range(nr):
for c in range(nc):
if grid[r][c] == '1':
res = res + 1
dfs(grid, r, c)
return res
岛屿最大面积
题意
给定一个包含了一些 0 和 1 的非空二维数组 grid 。
一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-area-of-island
题解
利用dfs, 找出连通区域的最大面积。
代码
class Solution(object):
def maxAreaOfIsland(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
def dfs(grid, r, c, area):
grid[r][c] = 0
nr, nc = len(grid), len(grid[0])
area = area + 1
for x, y in [(r-1, c), (r+1, c), (r, c-1), (r, c+1)]:
if -1<x<nr and -1<y<nc and grid[x][y]==1:
area = dfs(grid, x, y, area)
return area
nr = len(grid)
if nr == 0:
return 0
nc = len(grid[0])
maxarea = 0
for r in range(nr):
for c in range(nc):
if grid[r][c]==1:
maxarea = max(dfs(grid, r, c, area=0), maxarea)
return maxarea
最大人工岛
题意
在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地。
进行填海之后,地图上最大的岛屿面积是多少?(上、下、左、右四个方向相连的 1 可形成岛屿)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/making-a-large-island
题解
1、求出总共有多少个连通区域,并为这些区域贴上标签;
2、遍历网格,对于0值,判断他们周围是否有连通区域,有的话加上。
代码
class Solution(object):
def largestIsland(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
def dfs(grid, r, c, count, area, step, dict):
temp = []
if step==1:
grid[r][c] = count
area = area + 1
nr, nc = len(grid), len(grid[0])
for x, y in [(r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)]:
if -1 < x < nr and -1 < y < nc and grid[x][y] == 1 and step==1:
area = dfs(grid, x, y, count, area, step, dict)
if -1 < x < nr and -1 < y < nc and grid[x][y] != 0 and step==2 and grid[x][y] not in temp:
area = dict[grid[x][y]] + area
temp.append(grid[x][y])
return area
#先统计每个区域
res = {}
nr = len(grid)
if nr == 0:
return 0
nc = len(grid[0])
count = 2
for r in range(nr):
for c in range(nc):
if grid[r][c]==1:
area = dfs(grid=grid, r=r, c=c, count=count, area = 0, step=1, dict = {})
res[count]=area
count = count + 1
#将一格从0变成1
maxarea = 0
for r in range(nr):
for c in range(nc):
if grid[r][c]==0:
maxarea = max(dfs(grid=grid, r=r, c=c, count=0, area=1, step=2, dict=res), maxarea)
if maxarea==0:
maxarea = nc * nr
return maxarea