@author = YHR | 转载请标明来源!
题目描述
题解
先马一下重点吧,这几天真的好累,来不及更博,刷题强度也有点大,大概马一下几个关键的地方
并查集 – 连通问题
官方给我最大的帮助就是
- 并查集 不需要按结点的顺序来连通,任何俩可以连通就连通!
然后出现了时间限制
-
时间就对应threshhold,等于threshold的位置,在此刻海拔终于等于0!has been drowned
-
然后再看同学们的解法 给我的启发就是:已经连通的人,就别搭理他了,决定权都在没连通的人的手上! 缩小范围了~
就缩小了时间,过了!
python 代码
'''
官方给我最大的帮助就是
1. 并查集 不需要按结点的顺序来连通,任何俩可以连通就连通!
然后出现了时间限制
2. 时间就对应threshhold,等于threshold的位置,在此刻海拔终于等于0!has been drowned
3. 然后再看同学们的解法 给我的启发就是
已经连通的人,就别搭理他了,决定权都在没连通的人的手上! 缩小范围了~
就缩小了时间,过了!
'''
class Solution:
def swimInWater(self, grid) :
self.rows = len(grid)
self.cols = len(grid[0])
return (self.method(grid))
pass
def useIdgetRowCol(self, id):
row = id//self.cols
col = id%self.cols
return row, col
def findParent(self, parentDict, node):
parent = parentDict[node]
while parent != node:
node = parent
parent = parentDict[node]
return parent
def method(self, grid):
# initial the heightHash
heightsHash = {}
for _r in range(self.rows):
for _c in range(self.cols):
val = grid[_r][_c]
if val in heightsHash:
heightsHash[val].append(_r * self.cols + _c)
else:
heightsHash[val] = [_r * self.cols + _c]
parentDict = [_ for _ in range(self.rows*self.cols)]
childsize = [1]*(self.rows*self.cols)
dir = [[0,-1], [0,1], [1,0], [-1,0]]
t = 0
# key= 0 表示当前第t时刻这些index的位置已经被水淹了!
new_drowned_indexes = heightsHash[0]
while t>=0:
# new_drowned_indexes -- 已经连通的人,就别搭理他了,决定权都在没连通的人的手上! 缩小范围了~
for drowned_id in new_drowned_indexes:
this_r, this_c = self.useIdgetRowCol(drowned_id)
this_parent = self.findParent(parentDict, drowned_id)
for _ in range(4):
new_r, new_c = this_r+dir[_][0], this_c+dir[_][1]
if 0<=new_r<self.rows and 0<=new_c<self.cols and (new_r*self.cols+new_c) in heightsHash[0]:
new_parent = self.findParent(parentDict, (new_r*self.cols+new_c))
if childsize[this_parent] < childsize[new_parent]:
this_parent, new_parent = new_parent , this_parent
parentDict[new_parent] = this_parent
childsize[this_parent] += childsize[new_parent]
if self.findParent(parentDict, 0) == self.findParent(parentDict, self.rows*self.cols-1):
return t
t += 1 # t增加一秒
# 更新相对的heights
if t>0:
if t in heightsHash:
heightsHash[0] += heightsHash[t]
new_drowned_indexes = heightsHash[t] # 新加进来的unseen -- new_drowned_indexes 还没连通的人的手上
del heightsHash[t]