200、岛屿数量
好家伙完全没思路,百度一下。。。
这是官方解答
https://leetcode.cn/problems/number-of-islands/solution/dao-yu-shu-liang-by-leetcode/
方法一:深度优先搜索
我们可以将二维网格看成一个无向图,竖直或水平相邻的 11 之间有边相连。
为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 11,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 11 都会被重新标记为 00。
最终岛屿的数量就是我们进行深度优先搜索的次数。
class Solution:
def numIslands(self, grid) :
count = 0
n, m = len(grid), len(grid[0])#设行数和列数
def dfs(i, j):
if grid[i][j] == '1':
grid[i][j] = '0'#把当前的值设为0,代表已经遍历过
for (x, y) in [(0, 1), (1, 0), (-1, 0), (0, -1)]:#遍历上下左右四个网格
if 0 <= i + x <= n - 1 and 0 <= j + y <= m - 1:
dfs(i + x, j + y)
for i in range(n):
for j in range(m):#遍历所有元素
if grid[i][j] == '1':
count += 1
dfs(i, j)
return count
547、省份数量
我本来感觉应该就之间按照上面的岛屿数量题是一样的,然后写完就报错了
来,具体看一下:
我发现评论区有很多人也是有这个困惑,然后有人解释:
遍历的对象是每个城市,而不是二维数组的每个坐标,不是常规的DFS,因为还存在间接相连接的缘故,可能节点A只和一个节点B相连但是节点B可以和节点C,D,E都相连只是单纯DFS计数的话不能统计出间接相连的情况。
说是用并查集解决,啥事并查集?
指路:
https://blog.csdn.net/the_zed/article/details/105126583
把别人的贴一下,这个事并查集解法,答主还给出了其他解法:
https://blog.csdn.net/weixin_44699689/article/details/112303555
class DisjointSet:
def __init__(self,n):
self.set_id = [i for i in range(n)]
self.set_size = [1 for _ in range(n)]
self.count = n
def find(self,p):
while p !=self.set_id[p]:
self.set_id[p] = self.set_id[self.set_id[p]]
p = self.set_id[p]
return p
def union(self,p,q):
i = self.find(p)
j = self.find(q)
if i == j:
return
if self.set_size[i] < self.set_size[j]:
self.set_id[i] = j
self.set_size[j] += self.set_size[i]
else:
self.set_id[j] = i
self.set_size[i] += self.set_size[j]
self.count -= 1
class Solution:
def findCircleNum(self, M):
"""
:type M: List[List[int]]
:rtype: int
"""
disjoint_set = DisjointSet(len(M))
for i in range(len(M)):
for j in range(len(M)):
if M[i][j] == 1 :
disjoint_set.union(i,j)
return disjoint_set.count