【leetcode】778. Swim in Rising Water

题目如下:

 

解题思路:本题题干中提到了一个非常重要的前提:"You can swim infinite distance in zero time",同时也给了一个干扰条件,那就是示例2里面的说明,"We need to wait until time 16 so that (0, 0) and (4, 4) are connected."。那么,游泳的人是否需要先游到(1,4)这个点然后等待到time16呢?把问题简化一下,游泳者可以直接在(0,0)等待到time16,这样问题就变成了在什么时间点,游泳的人可以从起点游到终点。在某一特定时间点,矩阵中所有大于这个时间的元素认为是障碍,这样是不是就是一个迷宫问题了?至于怎么找到最小的时间点,首先可以确定,最大的时间是矩阵中值最大的元素,最小的时间是起点元素和终点元素的较大值。显然,用二分查找非常合适。

代码如下:

class Solution(object):
    def canReach(self,time,matrix):
        tl = [0] * len(matrix[0])
        visit = []
        for i in matrix:
            visit.append(tl[:])
        row = len(matrix)
        column = len(matrix[0])
        queue = [(0,0)]
        visit[0][0] = 1
        while len(queue) > 0:
            x,y = queue.pop(0)
            #print x,y
            if x == row-1 and y == column-1:
                return True
            if x - 1 >= 0 and matrix[x-1][y] <= time and visit[x-1][y] == 0:
                queue.append((x-1,y))
                visit[x-1][y] = 1
            if x + 1 < row and matrix[x+1][y] <= time and visit[x+1][y] == 0:
                queue.append((x+1,y))
                visit[x+1][y] = 1
            if y - 1 >= 0 and matrix[x][y-1] <= time and visit[x][y-1] == 0:
                queue.append((x,y-1))
                visit[x][y-1] = 1
            if y + 1 < column and matrix[x][y+1] <= time and visit[x][y+1] == 0:
                queue.append((x,y+1))
                visit[x][y+1] = 1
        return False

    def swimInWater(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        low = max(grid[0][0],grid[-1][-1])
        high = low
        for i in grid:
            for j in i:
                high = max(j,high)
        res = len(grid)*len(grid)
        while low <= high:
            mid = (low + high) / 2
            if self.canReach(mid,grid) == True:
                res = min(res,mid)
                high = mid - 1
            else:
                low = mid + 1
        return res

 

posted @ 2018-08-20 19:14  seyjs  阅读(434)  评论(0编辑  收藏  举报