题目:

  1. 给定一个二维的矩阵,包含 'X' 'O'(字母 O)。
  2. 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 'X' 填充。
  3. 示例:
  4. X X X X
  5. X O O X
  6. X X O X
  7. X O X X
  8. 运行你的函数后,矩阵变为:
  9. X X X X
  10. X X X X
  11. X X X X
  12. X O X X
  13. 来源:力扣(LeetCode
  14. 链接:https://leetcode-cn.com/problems/surrounded-regions
  15. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

答案:

时间:

15min,pos算错了

  1. class UnionFind:
  2. def __init__(self,n):
  3. self.parent = [i for i in range(n)]
  4. self.rank = [1 for _ in range(n)]
  5. self.rank[-1]=float("inf")
  6. self.count = n
  7. def find(self,p):
  8. while self.parent[p] != self.parent[self.parent[p]]:
  9. self.parent[p] = self.parent[self.parent[p]]
  10. return self.parent[p]
  11. def union(self,p,q):
  12. i = self.find(p)
  13. j = self.find(q)
  14. if i == j:
  15. return
  16. if self.rank [i] < self.rank [j]:
  17. self.parent[i] = j
  18. self.rank [j] += self.rank [i]
  19. else:
  20. self.parent[j] = i
  21. self.rank [i] += self.rank [j]
  22. self.count -= 1
  23. class Solution:
  24. def solve(self, board: List[List[str]]) -> None:
  25. """
  26. Do not return anything, modify board in-place instead.
  27. """
  28. if not board or not board[0]:return
  29. m,n=len(board),len(board[0])
  30. area=UnionFind(m*n+1)
  31. directs=[(1,0),(-1,0),(0,1),(0,-1)]
  32. for i in range(m):
  33. for j in range(n):
  34. pos=i*n+j
  35. if board[i][j]=="X":area.union(pos,m*n)
  36. else:
  37. if i==0 or j==0 or j==n-1 or i==m-1:area.union(pos,m*n)
  38. else:
  39. for ix,iy in directs:
  40. new_i,new_j=i+ix,j+iy
  41. new_pos=new_i*n+new_j
  42. if board[new_i][new_j]=="O":
  43. area.union(pos,new_pos)
  44. for i in range(m):
  45. for j in range(n):
  46. pos=i*n+j
  47. if area.find(pos)!=m*n:
  48. board[i][j]="X"

要点:

1. 用并查集去想,边界肯定连到黑洞区域里(m*n+1),X连到黑洞里即可

那么为了让他们的爹同一,给于黑洞最大的rank,在并查集的地方做个小修改即可

  1. self.rank[-1]=float("inf")

2. 三个地方pos算错,太傻比了

pos=i*n+j,别搞错了

3. 找到不在黑洞里的填充就好了

其他:

代码报错:无