8.19 - hard - 64

317 . Shortest Distance from All Buildings

典型的BFS的题目,BFS可以求得最短距离,所以很多碰到最小路径的时候可以考虑用BFS,还有这道题可以在访问的时候多记录一些信息,可以达到剪枝的效果

class Solution(object):
    def shortestDistance(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        m = {} # building (i, j) -> {} # 0 x,y -> distance to i,j 
        count = 0
        total = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == 1:
                    total += 1
        
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == 1:
                    count += 1
                    building = (i, j)
                    m[building] = {}
                    if not self.bfs(grid, building, m, total):
                        return -1
        h = {}
        for key, val in m.iteritems():
            if not val:
                return -1
            for k, v in val.iteritems():
                if k in h:
                    h[k] = [h[k][0]+v, h[k][1]+1] # total steps, number of buildings reached
                else:
                    h[k] = [v, 1]
        if not h:
            return -1
        res = sys.maxint
        found = False
        for v in h.values():
            if v[1] == count:
                res = min(res, v[0])
                found = True
        if found:
            return res
        else:
            return -1
        
        
    def bfs(self, grid, building, m, total):
        dist = 0
        i, j = building
        count_building = 1
        visited = [[False for _ in range(len(grid[0]))] for _ in range(len(grid))]
        visited[i][j] = True
        queue = [[i+1, j], [i-1, j], [i, j+1], [i, j-1]]
        while queue: 
            l = len(queue)
            dist += 1
            for k in range(l):
                x, y = queue.pop(0)
                if 0 <= x < len(grid) and 0 <= y < len(grid[0]) and not visited[x][y]:
                    visited[x][y] = True
                    if grid[x][y] == 0:
                        if (x, y) in m[building]:
                            continue
                        else:
                            m[building][(x,y)] = dist
                            queue += [[x+1, y], [x-1, y], [x, y+1], [x, y-1]]
                    elif grid[x][y] == 1:
                        count_building += 1
        return count_building == total
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,774评论 0 33
  • Graph的题: 值得思考的点和概念:树、有向图、无向图、相连性、有圈无圈树是各节点之间只有一条路可走的无圈无向图...
    __小赤佬__阅读 631评论 0 0
  • 312. Burst Balloons: 区间dp+backtracking315. Count of Small...
    健时总向乱中忙阅读 295评论 0 0
  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 9,284评论 3 52
  • 墨香入手无眠夜 含泪凝望书中她 不信杯中情思苦 好似知你心凄凉
    长道赫书阅读 219评论 1 5