文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 正常思维BFS
    • 2.2 逆向思考BFS

1. 题目

你是个房地产开发商,想要选择一片空地 建一栋大楼。
你想把这栋大楼够造在一个距离周边设施都比较方便的地方,通过调研,你希望从它出发能在 最短的距离和 内抵达周边全部的建筑物。
请你计算出这个最佳的选址到周边全部建筑物的 最短距离和

提示:
你只能通过向上、下、左、右四个方向上移动。

给你一个由 0、1 和 2 组成的二维网格,其中:

  • 0 代表你可以自由通过和选择建造的空地
  • 1 代表你无法通行的建筑物
  • 2 代表你无法通行的障碍物
示例:
输入:[[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
输出:7
解析:
给定三个建筑物 (0,0)、(0,4) 和 (2,2) 以及一个位于 (0,2) 的障碍物。
由于总距离之和 3+3+1=7 最优,所以位置 (1,2) 是符合要求的最优地点,故返回7。注意:
题目数据保证至少存在一栋建筑物,如果无法按照上述规则返回建房地点,则请你返回 -1。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-distance-from-all-buildings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 正常思维BFS

59 / 72 个通过测试用例

  • 从每个空地出发,其找所有的房屋,空地如果非常多,复杂度为O(m2n2)
class Solution {public:int shortestDistance(vector<vector<int>>& grid) {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};vector<vector<int>> place;int i, j, k, x, y, building_nums = 0, count, mindis = INT_MAX, dis, d, size;int m = grid.size(), n = grid[0].size();for(i = 0; i < m; i++)for(j = 0; j < n; j++)if(grid[i][j]==0)place.push_back({i,j});else if(grid[i][j]==1)building_nums++;for(auto& pos : place)//空地{count = 0;dis = 0;d = 0;queue<vector<int>> q;vector<vector<bool>> visited(m, vector<bool>(n,false));q.push({pos[0], pos[1]});//x,yvisited[pos[0]][pos[1]] = true;while(!q.empty()){size = q.size();d++;//层数if(dis >= mindis)break;while(size--){x = q.front()[0];y = q.front()[1];q.pop();for(k = 0; k < 4; ++k){i = x + dir[k][0];j = y + dir[k][1];if(i>=0 && i<m && j>=0 && j<n && !visited[i][j] && grid[i][j]!=2){visited[i][j] = true;if(grid[i][j]==1)//找到一个房子{count++;dis += d;}else// (grid[i][j]==0)q.push({i,j});}}}}if(count == building_nums){  //找到了所有房子mindis = min(mindis, dis);}}return mindis==INT_MAX ? -1 : mindis;}
};

2.2 逆向思考BFS

  • 从每个房屋出发,dis 数组记录每个房屋到空地的距离
  • totaldis 数组记录,每个房子遍历空地后,之前所有房子到空地的总距离
class Solution {public:int shortestDistance(vector<vector<int>>& grid) {//从每个建筑物出发去找空地,空地对每个建筑物的距离累积vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};vector<vector<int>> build;int i, j, k, x, y, mindis;int m = grid.size(), n = grid[0].size();for(i = 0; i < m; i++)for(j = 0; j < n; j++)if(grid[i][j]==1)build.push_back({i,j});vector<vector<int>> dis(m, vector<int>(n, 0));//记录单次遍历1个房屋到空地的距离vector<vector<int>> totaldis(m, vector<int>(n, 0));//记录所有房屋到空地的距离int emptyPlace = 0;//空地的标记数字for(auto& pos : build)//遍历房子{queue<vector<int>> q;// vector<vector<bool>> visited(m, vector<bool>(n,false));q.push({pos[0], pos[1]});//x,ymindis = INT_MAX;while(!q.empty()){x = q.front()[0];y = q.front()[1];q.pop();for(k = 0; k < 4; ++k){i = x + dir[k][0];j = y + dir[k][1];if(i>=0 && i<m && j>=0 && j<n && grid[i][j] == emptyPlace)//空地{dis[i][j] = dis[x][y]+1;//该房子到ij空地的距离totaldis[i][j] += dis[i][j];//之前所有房子到这的距离和mindis = min(mindis, totaldis[i][j]);// visited[i][j] = true;grid[i][j]--;//从lx_lx大佬那学的,不用开访问数组了q.push({i,j});}}}if(mindis == INT_MAX)return -1;//该房屋不能到达任何空地emptyPlace--;//更新空地的标记,免开访问标记数组}return mindis==INT_MAX ? -1 : mindis;}
};

36 ms 11.9 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 317. 离建筑物最近的距离(逆向BFS)*相关推荐

  1. 317 离建筑物最近的距离

    题目描述: 你是个房地产开发商,想要选择一片空地 建一栋大楼.你想把这栋大楼够造在一个距离周边设施都比较方便的地方,通过调研,你希望从它出发能在 最短的距离和 内抵达周边全部的建筑物.请你计算出这个最 ...

  2. 2022-01-14:离建筑物最近的距离。 你是个房地产开发商,想要选择一片空地 建一栋大楼。你想把这栋大楼够造在一个距离周边设施都比较方便的地方,通过调研,你希望从它出发能在 最短的距离和 内抵达周

    2022-01-14:离建筑物最近的距离. 你是个房地产开发商,想要选择一片空地 建一栋大楼.你想把这栋大楼够造在一个距离周边设施都比较方便的地方,通过调研,你希望从它出发能在 最短的距离和 内抵达周 ...

  3. Walfisch-Ikegami模型 建筑物的高度、建筑物间的距离、街道宽度对传输损耗的影响

    前面我们了解到COST-231 Walfisch-Ikegami模型,可以分析建筑物的高度和建筑物之间的距离以及街道宽度这三个城市特征量对于电波传输的影响,从而使市区环境蜂窝通信的能得到更加准确的估计 ...

  4. 【LeetCode 】试题总结:广度优先搜索(BFS)

    [LeetCode ]试题总结:广度优先搜索(BFS) 一.数据结构:二叉树中的 BFS (一).二叉树的堂兄弟节点 试题链接 解题思路 代码 (二).二叉树的层序遍历 II (三).二叉树的锯齿形层 ...

  5. hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数

    题意: 题意就是八数码,给了一个3 * 3 的矩阵,上面有八个数字,有一个位置是空的,每次空的位置可以和他相邻的数字换位置,给你一些起始状态 ,给了一个最终状态,让你输出怎么变换才能达到目的. 思路: ...

  6. LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 2.3 并查集 1. 题目 给定一组 N 人(编号为 1, 2, -, N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢 ...

  7. LeetCode 991. 坏了的计算器(逆向思考)

    1. 题目 在显示着数字的坏计算器上,我们可以执行以下两种操作: 双倍(Double):将显示屏上的数字乘 2: 递减(Decrement):将显示屏上的数字减 1 . 最初,计算器显示数字 X. 返 ...

  8. leetcode:2463. 最小移动总距离【排序 + nmm复杂度 + 限制性dp】

    目录 题目截图 题目分析 ac code 总结 题目截图 题目分析 robot和factory排序,可以证明按顺序取连续的距离最少的 f[i][j]表示前i个工厂取前j个机器人的最少距离,可以两边都添 ...

  9. 【LeetCode】1184. 公交站间的距离(C++)

    1184. 公交站间的距离 1 题目描述 2 示例描述 2.1 示例1 2.2 示例2 2.3 示例3 2.4 示例4 2.5 示例5 3 解题提示 4 解题思路 5 源码详解(C++) 1 题目描述 ...

最新文章

  1. 对相机所看的视角截屏保存为图片
  2. python读取数据的函数详解_你了解文件缓存机制吗?磁盘文件如何读写?Python中open函数详解...
  3. 349. Intersection of Two Arrays 两个数组的交集
  4. 表的设计命名的十个注意点
  5. 解决iview表单中时间选择起的验证失败问题
  6. 在jOOQ之上构建的RESTful JDBC HTTP服务器
  7. 微型计算机常用的worm是,2010江西省计算机等级考试试题 二级C试题考试答题技巧...
  8. 微信获取token -1000
  9. Vue.js 学习笔记 四 用一,二,三的知识做个跑马灯
  10. 2.高性能MySQL --- MySQL 基准测试
  11. in与exist , not in与not exist 的区别
  12. 2021-06-27循环控制 mapSet
  13. jquery 文档就绪
  14. QProcess解决无交互输入密码问题
  15. 74HC138 芯片(38译码器)和74HC245 芯片(处理段码)
  16. 实现阿里云DDNS解析
  17. RFCOMM简单介绍
  18. 性能工具之stress工具使用教程(带源码说明)
  19. 大数据的核心架构层是哪些?
  20. 如何将webp批量转换jpg?

热门文章

  1. druid.properties文件的配置
  2. 浅谈管理数据平台的一些想法
  3. excel统计行数_值得收藏的6个Excel函数公式(有讲解)
  4. QT输入输出(四)之 QProcess
  5. android mysql 数据库文件_android mysql数据库文件
  6. tableau 倒序都倒了_Tableau优秀作品拆解复刻01-是时候终结瘘管病了
  7. C++远航之封装篇——深拷贝、浅拷贝
  8. 项目中cxf和weblogic整合时报错的问题
  9. vc++网络安全编程范例(14)-openssl bio编程
  10. linux下设定动态库路径的命令-error while loading shared libraries: xxx.so.x错误的原因和解决办法