【1月打卡~Leetcode每日一题】778. 水位上升的泳池中游泳(难度:困难)

778. 水位上升的泳池中游泳

在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度。
现在开始下雨了。当时间为 t 时,此时雨水导致水池中任意位置的水位为 t 。你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。假定你可以瞬间移动无限距离,也就是默认在方格内部游动是不耗时的。当然,在你游泳的时候你必须待在坐标方格里面。
你从坐标方格的左上平台 (0,0) 出发。最少耗时多久你才能到达坐标方格的右下平台 (N-1, N-1)?

【1月打卡~Leetcode每日一题】778. 水位上升的泳池中游泳(难度:困难)_第1张图片

思路:优先队列+并查集
从最小高度开始,依次合并它的相邻顶点中高度小于等于它的单元格,知道左上角和右下角连通为止

class Solution:
    def swimInWater(self, grid: List[List[int]]) -> int:
        save = set()
        dic = collections.defaultdict(set)
        n = len(grid)

        for i in range(n):
            for j in range(n):
                save.add(grid[i][j])
                dic[grid[i][j]].add(i*n+j)
        
        save = collections.deque(sorted(list(save)))
        
        parent = list(range(n*n))

        def find(index):
            if index != parent[index]: 
                parent[index] = find(parent[index])
            return parent[index]

        def union(index1,index2):
            parent[find(index1)] = find(index2)

        while(save):
            h = save.popleft()
            directions = [(-1,0),(1,0),(0,-1),(0,1)] 
            for i in dic[h]:
                x,y = i//n,i%n
                for direction in directions:
                    x_,y_ = direction[0]+x,direction[1]+y
                    if 0<=x_<n and 0<=y_<n and grid[x][y]>=grid[x_][y_]:      
                        union(x_*n+y_,x*n+y)
            if find(parent[0])==find(parent[-1]):
                return h

时间复杂度O(N²logN)

你可能感兴趣的:(并查集,队列,python,算法,数据结构)