zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    【Qt开发】01-第一个Qt程序Hello World!
    Git使用总结(三):协同开发常见冲突
    公钥、私钥、数字签名、数字证书、对称与非对称算法、HTTPS
    通俗理解TCP的三次握手
    Flink安装极简教程-单机版
    程序员工资那些事!
    vim实战:插件安装(Vundle,NerdTree)
    Git使用总结(二):分支管理
    Git使用总结(一):简介与基本操作
    C++11并发编程:多线程std::thread
  • 原文地址:https://www.cnblogs.com/seyjs/p/9370561.html
Copyright © 2011-2022 走看看