LeetCode Shortest Distance from All Buildings
原题链接在这里:https://leetcode.com/problems/shortest-distance-from-all-buildings/
题目:
You want to build a house on an empty land which reaches all buildings in the shortest amount of distance. You can only move up, down, left and right. You are given a 2D grid of values 0, 1 or 2, where:
- Each 0 marks an empty land which you can pass by freely.
 - Each 1 marks a building which you cannot pass through.
 - Each 2 marks an obstacle which you cannot pass through.
 
Example:
Input: [[1,0,2,0,1],[0,0,0,0,0],[0,0,1,0,0]] 1 - 0 - 2 - 0 - 1
| | | | |
0 - 0 - 0 - 0 - 0
| | | | |
0 - 0 - 1 - 0 - 0 Output: 7 Explanation: Given three buildings at(0,0),(0,4),(2,2), and an obstacle at(0,2),he point
t(1,2)is an ideal empty land to build a house, as the total
travel distance of 3+3+1=7 is minimal. So return 7.
Note:
There will be at least one building. If it is not possible to build such house according to the above rules, return -1.
题解:
从每一座building开始做BFS, 更新每个空地达到building的距离总和 以及 每个空地能到达building的个数.
第二次扫描grid, 若是空地并且它能到达的building数目是总共的building数目,就更新min距离.
Note: For the second iteration, check 2 conditions. grid[i][j] < 0 && reachCount[i][j] = totalCount.
Time Complexity: O(m^2 * n^2), 每次BFS用O(mn), 一共做了m*n次BFS.
Space: O(m*n)
AC Java:
 class Solution {
     public int shortestDistance(int[][] grid) {
         if(grid == null || grid.length == 0 || grid[0].length == 0){
             return 0;
         }
         int m = grid.length;
         int n = grid[0].length;
         //记录每个点能够到达building的个数
         int [][] reachCount = new int[m][n];
         int totalCount = 0;
         for(int i = 0; i<m; i++){
             for(int j = 0; j<n; j++){
                 if(grid[i][j] == 1){
                     //遇到building, 从这个building开始做bfs
                     totalCount++;
                     bfs(grid, i, j, reachCount);
                 }
             }
         }
         int res = Integer.MAX_VALUE;
         for(int i = 0; i<m; i++){
             for(int j = 0; j<n; j++){
                 if(grid[i][j] < 0 && reachCount[i][j] == totalCount){
                     res = Math.min(res, -grid[i][j]);
                 }
             }
         }
         return res == Integer.MAX_VALUE ? -1 : res;
     }
     int [][] dirs = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
     private void bfs(int [][] grid, int i, int j, int [][] reachCount){
         int level = 0;
         int m = grid.length;
         int n = grid[0].length;
         LinkedList<int []> que = new LinkedList<>();
         boolean[][] visited = new boolean[m][n];
         que.add(new int[]{i, j});
         visited[i][j] = true;
         while(!que.isEmpty()){
             int size = que.size();
             while(size-- > 0){
                 int [] cur = que.poll();
                 grid[cur[0]][cur[1]] -= level;
                 reachCount[cur[0]][cur[1]]++;
                 for(int [] dir : dirs){
                     int x = cur[0] + dir[0];
                     int y = cur[1] + dir[1];
                     if(x < 0 || x >=m || y < 0 || y >=n || visited[x][y] || grid[x][y] > 0){
                         continue;
                     }
                     que.add(new int[]{x, y});
                     visited[x][y] = true;
                 }
             }
             level++;
         }
     }
 }
LeetCode Shortest Distance from All Buildings的更多相关文章
- [LeetCode] Shortest Distance from All Buildings 建筑物的最短距离
		
You want to build a house on an empty land which reaches all buildings in the shortest amount of dis ...
 - [LeetCode] Shortest Distance from All Buildings Solution
		
之前听朋友说LeetCode出了一道新题,但是一直在TLE,我就找时间做了一下.这题是一个比较典型的BFS的题目,自己匆忙写了一个答案,没有考虑优化的问题,应该是有更好的解法的. 原题如下: You ...
 - leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings
		
542. 01 Matrix https://www.cnblogs.com/grandyang/p/6602288.html 将所有的1置为INT_MAX,然后用所有的0去更新原本位置为1的值. 最 ...
 - [Locked] Shortest Distance from All Buildings
		
Shortest Distance from All Buildings You want to build a house on an empty land which reaches all bu ...
 - [LeetCode] 317. Shortest Distance from All Buildings 建筑物的最短距离
		
You want to build a house on an empty land which reaches all buildings in the shortest amount of dis ...
 - [LeetCode] Shortest Distance to a Character 到字符的最短距离
		
Given a string S and a character C, return an array of integers representing the shortest distance f ...
 - Shortest Distance from All Buildings
		
You want to build a house on an empty land which reaches all buildings in the shortest amount of dis ...
 - LeetCode 317. Shortest Distance from All Buildings
		
原题链接在这里:https://leetcode.com/problems/shortest-distance-from-all-buildings/ 题目: You want to build a ...
 - 317.	Shortest Distance from All Buildings
		
题目: Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where th ...
 
随机推荐
- "Accepted today?"[HDU1177]
			
"Accepted today?" Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
 - [知识点]网络流之Edmond-Karp算法
			
// 此博文为迁移而来,写于2015年2月2日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vr12.html ...
 - BZOJ3636: 教义问答手册
			
Description “汉中沃野如关中,四五百里烟蒙蒙.黄云连天夏麦熟,水稻漠漠吹秋风.”——摘自 黄裳<汉中行>“泉岭精神不朽,汉中诸球永生.”——摘自<泉岭精神创立者语录> ...
 - spring源码学习之路---IOC容器初始化要义之bean定义载入(五)
			
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,时间不多,研究 ...
 - HDU 1251  Trie树模板题
			
1.HDU 1251 统计难题 Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...
 - CodeForces 670D1   暴力或二分
			
今天,开博客,,,激动,第一次啊 嗯,,先来发水题纪念一下 D1. Magic Powder - 1 This problem is given in two versions that diff ...
 - tomcat、Linux服务器
			
tomcat.Linux服务器 用到的命令 解压命令: tar -zxvf 文件名 配置 : vi /etc/profile 按 i 进入 ...
 - Java_动态加载
			
Java类动态加载(一)——java源文件动态编译为class文件最近在做java动态加载这方面的工作,起初也遇到了很多困难.网上关于这方便的东西很零散,为了便于日后回过头来再看,于是我将这几天的心得 ...
 - 六、雪花《苹果iOS实例编程入门教程》
			
该app为应用的功能为制作一场雪景 现版本 SDK 8.4 Xcode 纲要:- UIImageView 的运用- onTimer 代码运用- onAnimation 代码运用 运行Xcode 选择 ...
 - osg中使用MatrixTransform来实现模型的平移/旋转/缩放
			
osg中使用MatrixTransform来实现模型的平移/旋转/缩放 转自:http://www.cnblogs.com/kekec/archive/2011/08/15/2139893.html# ...