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

文章目录

    • 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阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 运行Asp.net MVC3

1 先通过SVN获取最新版的Asp.net MVC3代码 2 用Monodevelop打开后&#xff0c;进入Web项目的引用,删除标了红色的引用 3 添加引用“System.Web.Mvc.dll”和“System.Web.WebPages.Deployment.dll” 4 重新编译&#xff0c;然后删除Web项目的bin下的“Microsoft.Web.Infrastruct…

LeetCode 431. 将 N 叉树编码为二叉树(递归/层序)

文章目录1. 题目2. 解题2.1 递归2.2 BFS1. 题目 设计一个算法&#xff0c;可以将 N 叉树编码为二叉树&#xff0c;并能将该二叉树解码为原 N 叉树。 一个 N 叉树是指每个节点都有不超过 N 个孩子节点的有根树。 类似地&#xff0c;一个二叉树是指每个节点都有不超过 2 个孩子节…

包概念与__init__注意事项

1.包的概念 为了组织好模块&#xff0c;将多个模块分为一个包。包是python模块文件所在的目录&#xff0c;且该目录下必须存在__init__.py文件。常见的包结构如下&#xff1a; package_a ├── __init__.py ├── module_a1.py └── module_a2.py package_b ├── _…

服务器上有涉密文件,涉密文件保密管理规定

为贯彻落实国家和省、市、区保密局对涉密文件资料管理工作的要求&#xff0c;进一步做好我办涉密文件资料管理&#xff0c;特制定本规定。一、涉密文件的拟制、印刷、传递、承办、借阅、保管、归档、移交和销毁&#xff0c;必须严格履行审批、清点、登记、签收等手续。二、涉密…

服务器文件同步管理

服务器文件同步管理 原文 http://www.cnblogs.com/yanxiaodi/archive/2011/03/21/2296462.html 前几天有台服务器电源坏了&#xff0c;还好数据没有丢。因此必须做好服务器文件内容的备份。服务器主要是用来提供网站服务&#xff0c;带着一个数据库&#xff0c;数据库可以用分发…

LeetCode 774. 最小化去加油站的最大距离(极小极大化 二分查找)

文章目录1. 题目2. 解题1. 题目 假设我们在一条水平数轴上&#xff0c;列表 stations 来表示各个加油站的位置&#xff0c;加油站分别在 stations[0], stations[1], ..., stations[N-1] 的位置上&#xff0c;其中 N stations.length。 现在我们希望增加 K 个新的加油站&…

修改软件服务器json返回数据格式,AngularJS处理服务器端返回的JSON数据的格式问题...

用ng的$http服务发起ajax请求&#xff0c;php返回的JSON数据格式要正确&#xff01;一开始我的php页面是这样返回数据的&#xff1a;if($result){$oid mysqli_insert_id($conn);echo "{msg:succ,oid:$oid}";}else{echo "{msg:error}";}然后总是报错&#…

python编码规范与命名规范

编码规范 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 每行不超过80个字符&#xff0c;Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以利用这个特点. 如果需要, 你可以在表达式外围增加一对额外的圆括号.例如&#xff1a; x (This will build a …

Linux学习笔记(4) - 文件系统

4.1 什么是文件系统 文件系统表示存储在计算机上的文件和目录的数据结构&#xff0c;也可以用于存储文件的分区或磁盘&#xff0c;操作系统通过文件系统可以方便地查询和访问其中所包含的磁盘块。在Linux系统中&#xff0c;每个分区都是一个文件系统&#xff0c;都有自己的目录…

LeetCode 644. 最大平均子段和 II(二分查找)*

文章目录1. 题目2. 解题2.1 暴力超时2.2 二分查找1. 题目 给定一个包含 n 个整数的数组&#xff0c;找到最大平均值的连续子序列&#xff0c;且长度大于等于 k。并输出这个最大平均值。 样例 1: 输入: [1,12,-5,-6,50,3], k 4 输出: 12.75 解释: 当长度为 5 的时候&#xff…

python基础学习总结

1.python历史 Guido 89年圣诞开写 91年编辑器问世 优点与缺点 优点&#xff1a;简单、易学、免费开源、高层语言 可移植、解释、面向对象、扩展 丰富库、规范代码 缺点&#xff1a;运行速度、国内市场小、中文资料少 2.模式&#xff1a;文本、交互、集成开发 程序原理&am…

学生管理系统代码赏析

# 添加、删除、显示学生信息&#xff08;保存&#xff09; # 保存所有学生信息 students {} # 创建 ID 1000 # 控制系统是否退出 flag True # 从文件中读取学生信息 def load_students(): # 加载学生信息从文件中 stu_file open("students.txt",&quo…

LeetCode 527. 单词缩写(Trie树)

文章目录1. 题目2. 解题1. 题目 给定一个由n个不重复非空字符串组成的数组&#xff0c;你需要按照以下规则为每个单词生成最小的缩写。 初始缩写由起始字母省略字母的数量结尾字母组成。若存在冲突&#xff0c;亦即多于一个单词有同样的缩写&#xff0c;则使用更长的前缀代替…

POJ 1523 SPF (割点 点双连通分量)

题意&#xff1a;求出割点以及除去割点后的连通分量的数量(附带求出了点双连通分量(块)) [求割点]对图深度优先搜索&#xff0c;定义DFS(u)为u在搜索树&#xff08;以下简称为树&#xff09;中被遍历到的次序号。定义Low(u)为u或u的子树中能通过非父子边追溯到的最早的节点&…

质数——python代码赏析

一、求&#xff08;2—您输入数字&#xff09;之间的质数&#xff1a; num int(input("请输入您要输入的数字:"))a[] if num 2:a.append(2) elif num >2:for i in range(2,num1):for j in range(2,i):if i %j 0:breakelse:a.append(i)print(a) 二、求2-100之间…

LeetCode 1199. 建造街区的最短时间(优先队列贪心)

文章目录1. 题目2. 解题1. 题目 你是个城市规划工作者&#xff0c;手里负责管辖一系列的街区。在这个街区列表中 blocks[i] t 意味着第 i 个街区需要 t 个单位的时间来建造。 由于一个街区只能由一个工人来完成建造。 所以&#xff0c;一个工人要么需要再召唤一个工人&…

用Android-X86和VirtualBox打造高性能Android开发环境

现在已经采用genymotion替换下面的方法 https://www.genymotion.com转载于:https://www.cnblogs.com/sunzhuo1228/archive/2013/05/30/3109445.html

LeetCode 1088. 易混淆数 II(回溯/BFS)

文章目录1. 题目2. 解题2.1 回溯2.2 BFS1. 题目 本题我们会将数字旋转 180 来生成一个新的数字。 比如 0、1、6、8、9 旋转 180 以后&#xff0c;我们得到的新数字分别为 0、1、9、8、6。 2、3、4、5、7 旋转 180 后&#xff0c;是 无法 得到任何数字的。 易混淆数&#xf…

python——import导入模

1.import 搜索路径 import sys sys.path 路径搜索 从上⾯列出的⽬录⾥依次查找要导⼊的模块⽂件 表示当前路径 程序执⾏时导⼊模块路径 sys.path.append(/home/itcast/xxx) sys.path.insert(0, /home/itcast/xxx) #可以确保先搜索这个路径 I…