LeetCode 317 题的详细题目信息如下:

题目名称

Shortest Distance from All Buildings(中文译名:离建筑物最近的距离)

题目描述

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

  • 0 代表空地
  • 1 代表建筑物
  • 2 代表障碍物

你需要找到一个空地,使其到所有建筑物的总曼哈顿距离之和最小。如果不存在这样的空地(即没有任何空地能到达所有建筑物),则返回 -1。

曼哈顿距离的计算方式为:对于两个点 (x1, y1) 和 (x2, y2),其距离为 |x1 - x2| + |y1 - y2|。

示例

输入

[[1,0,2,0,1],[0,0,0,0,0],[0,0,1,0,0]
]

输出:7
解释
网格中共有 3 个建筑物。位于 (1,2) 的空地到所有建筑物的总距离为 7(到 (0,0) 的距离为 3,到 (0,4) 的距离为 3,到 (2,2) 的距离为 1,总和 3+3+1=7),是所有符合条件的空地中最小的。

约束条件

  • 网格的行数和列数均不超过 100。
  • 网格中至少有一个建筑物。

LeetCode 317. 离建筑物最近的距离 详细解题代码

/*** @param {number[][]} grid* @return {number}*/
var shortestDistance = function(grid) {// 边界条件判断:网格为空或行数/列数为0if (!grid || grid.length === 0 || grid[0].length === 0) {return -1;}const rows = grid.length;const cols = grid[0].length;let buildingCount = 0; // 记录建筑物的总数量// 存储每个空地到所有建筑物的距离之和const distanceSum = Array.from({ length: rows }, () => Array(cols).fill(0));// 存储每个空地能到达的建筑物数量const reachCount = Array.from({ length: rows }, () => Array(cols).fill(0));// 遍历网格中的每个单元格for (let i = 0; i < rows; i++) {for (let j = 0; j < cols; j++) {// 当遇到建筑物时,执行BFS计算距离if (grid[i][j] === 1) {buildingCount++;const queue = [[i, j, 0]]; // BFS队列,元素为[行, 列, 距离]const visited = Array.from({ length: rows }, () => Array(cols).fill(false));visited[i][j] = true; // 标记建筑物自身为已访问// BFS循环while (queue.length > 0) {const [curRow, curCol, dist] = queue.shift(); // 取出队首元素// 遍历四个方向(上、下、左、右)const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];for (const [dr, dc] of directions) {const newRow = curRow + dr;const newCol = curCol + dc;// 检查新坐标是否有效:在网格范围内、未访问过、且是空地if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols && !visited[newRow][newCol] && grid[newRow][newCol] === 0) {visited[newRow][newCol] = true; // 标记为已访问distanceSum[newRow][newCol] += dist + 1; // 累加距离reachCount[newRow][newCol]++; // 增加可到达的建筑物数量queue.push([newRow, newCol, dist + 1]); // 加入队列继续BFS}}}}}}// 寻找最小的距离和let minDistance = Infinity;for (let i = 0; i < rows; i++) {for (let j = 0; j < cols; j++) {// 只有空地且能到达所有建筑物时,才参与最小距离计算if (grid[i][j] === 0 && reachCount[i][j] === buildingCount) {minDistance = Math.min(minDistance, distanceSum[i][j]);}}}// 如果没有符合条件的空地,返回-1,否则返回最小距离return minDistance === Infinity ? -1 : minDistance;
};// 测试用例
const grid = [[1, 0, 2, 0, 1],[0, 0, 0, 0, 0],[0, 0, 1, 0, 0]
];
console.log(shortestDistance(grid)); // 输出:7

代码思路解析

  1. 初始化:创建两个二维数组 distanceSum 和 reachCount,分别用于记录每个空地到所有建筑物的距离总和以及能到达的建筑物数量。
  2. BFS 遍历:对每个建筑物执行 BFS,计算其到所有可达空地的距离,并更新 distanceSum 和 reachCount
  3. 筛选最优解:遍历所有空地,找到能到达所有建筑物(reachCount[i][j] 等于建筑物总数)且距离总和最小的空地。
  4. 边界处理:若不存在符合条件的空地,返回 -1,否则返回最小距离。

该解法通过 BFS 保证了距离计算的准确性,时间复杂度为 O (B×N×M)(其中 B 为建筑物数量,N 和 M 为网格的行数和列数),适用于题目给定的约束条件。

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

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

相关文章

AI之CodeTool之Kode:Kode(claude_code风格)的简介、安装和使用方法、案例应用之详细攻略

AI之CodeTool之Kode&#xff1a;Kode(claude_code风格)的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之PE之SystemPrompt&#xff1a;analysis_claude_code的简介、使用方法、案例应用之详细攻略 AI之CodeTool之Kode&#xff1a;Kode(claude_code风格)的简…

网络请求优化:用 Retrofit 拦截器玩转日志、重试与缓存,OkHttp 和 Volley 谁更香?

目录 1. 拦截器:Retrofit 的“超级管理员” 拦截器的本质 为什么用拦截器? 2. 日志拦截器:让请求和响应“现原形” 引入日志拦截器 实现日志拦截器 日志输出示例 生产环境注意事项 3. 重试拦截器:网络不稳定也能稳如狗 设计重试逻辑 集成到 Retrofit 优化重试策…

LeetCode - 283. 移动零

题目 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 思路 我们使用左右两个指针&#xff1a;左指针left指向已处理好的非零元素的末尾位置&#xff0c;右指针right用于遍历数组。 算法步骤&#xff1a; 初始化left为-1&#xff08;表示还没有处理任何非零元素&…

Redis不同场景下的注意事项

Redis常见的 使用场景&#xff1a; 缓存系统(核心场景) 存储热点数据&#xff0c;减少数据库访问压力。提升接口响应速度。技术点&#xff1a; 用String/Hash 存储结构化数据结合过期时间&#xff08;TTL&#xff09;和缓存淘汰策略(如LRU)管理内存。解决缓存问题&#xff1a;穿…

【完整源码+数据集+部署教程】高速公路施工区域物体检测系统源码和数据集:改进yolo11-RepNCSPELAN

背景意义 随着城市化进程的加快&#xff0c;高速公路建设与维护工作日益频繁&#xff0c;施工区域的安全管理成为亟待解决的重要问题。在高速公路施工区域&#xff0c;工人和设备的安全是首要考虑因素&#xff0c;而有效的物体检测系统能够显著提高施工现场的安全性与工作效率。…

如何在FastAPI中玩转全链路追踪,让分布式系统故障无处遁形?

url: /posts/30e1d2fbf1ad8123eaf0e1e0dbe7c675/ title: 全链路追踪如何让FastAPI微服务架构的每个请求都无所遁形? date: 2025-08-28T23:40:47+08:00 lastmod: 2025-08-28T23:40:47+08:00 author: cmdragon summary: 全链路追踪是现代微服务架构中监控系统行为的核心技术,通…

Win11 压缩实测:Win11 的压缩软件的最佳配置和使用方式

文章目录测试环境机器配置被压缩文件WinRAR7zipLinux子系统准备极限压缩减小字典的极限压缩7zipWin11准备极限压缩7zip系统内置右键压缩菜单极限压缩总结&#xff1a;Win11 的压缩软件的最佳配置和使用方式测试环境 机器配置 Win11系统 16GB内存 8核CPU 被压缩文件 文件夹内…

CMake构建学习笔记22-libxml2库的构建

在上一篇文章《CMake构建学习笔记21-通用的CMake构建脚本》中&#xff0c;笔者封装了一个通用的cmake构建脚本cmake-build.ps1&#xff0c;那么这里笔者就尝试通过这个脚本来构建libxml2库。 libxml2是GNOME项目下的XML库&#xff0c;虽然比不上TinyXML-2轻量&#xff0c;但是…

虚拟私有网络笔记

VPN应用场景 ——VPN概述  利用公共网络来构建的私人专用网络称为虚拟私有网络&#xff08;VPN&#xff0c; Virtual Private Network&#xff09;&#xff0c;用于构建VPN的公共网络包括Internet 、帧中继、ATM等。在公共网络上组建的VPN象企业现有的私有网络 一样提供安全性…

Python 轻量级 HTML 解析器 - lxml入门教程

文章目录初始化解析器路径查找查找所有标签查找指定 id 的标签查找指定 class 的标签查找包含指定 class 的标签复杂路径查找示例1示例2常见操作获取所有标签的链接获取 div 标签的文本内容, 其他标签类似其他元素操作初始化解析器 from lxml import html from lxml.html impor…

(CVPR-2025)VideoMage:文本生成视频扩散模型的多主体与动作定制化

VideoMage&#xff1a;文本生成视频扩散模型的多主体与动作定制化 paper title&#xff1a;VideoMage: Multi-Subject and Motion Customization of Text-to-Video Diffusion Models paper是National Taiwan University发表在CVPR 2025的工作 Code:链接 图1. 多主体与动作定制化…

OpenCV轮廓近似与Python命令行参数解析

在计算机视觉任务中&#xff0c;轮廓分析是目标检测、形状识别的核心步骤。而approxPolyDP函数作为轮廓简化的关键工具&#xff0c;能有效减少轮廓顶点数量&#xff0c;降低计算复杂度&#xff1b;同时&#xff0c;argparse库则能让Python脚本更灵活、易用。本文将结合具体案例…

基于Springboot在线音乐推荐平台

目录 一、项目介绍 二、功能介绍 三、核心代码 四、效果图 源码获取 前言 在经济繁荣的浪潮过去后&#xff0c;社会的焦点逐渐从物质追求转向了文化和生活品质的提升[1]。文化生活的繁荣成为人们关注的焦点之一&#xff0c;而音乐&#xff0c;作为文化的一部分&#xff0…

LeetCode算法日记 - Day 26: 归并排序、交易逆序对的总数

目录 1. 归并排序 1.1 题目解析 1.2 解法 1.3 代码实现 2. 交易逆序对的总数 2.1 题目解析 2.2 解法 2.3 代码实现 1. 归并排序 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任…

C++(Qt)软件调试---vcpkg安装crashpad(34)

C(Qt)软件调试—vcpkg安装crashpad&#xff08;34&#xff09; 文章目录C(Qt)软件调试---vcpkg安装crashpad&#xff08;34&#xff09;[toc]1 概述&#x1f41c;2 环境配置3 qt使用crashpad库捕获异常4 cmake中添加crashpad5 相关地址&#x1f410;更多精彩内容&#x1f449;内…

Kafka 副本同步异常与 ISR 收缩故障排查实录

背景 某高流量 Kafka 集群&#xff08;原 10G 网卡&#xff09;在切中心时频繁触发带宽报警&#xff0c;扩容至 25G 网卡后出现副本同步异常&#xff1a; 操作流程&#xff1a;停机→升级网卡→重启→触发分区同步→切换首选 Leader现象&#xff1a; 写入流量上升后&#xff0c…

顶点 (VS)vs 片段(FS):OpenGL纹理滚动着色器的性能博弈与设计哲学

一个微妙的选择&#xff0c;影响整个应用性能表现在实时图形渲染中&#xff0c;实现纹理滚动效果是一种常见需求。但当我们在顶点着色器和片段着色器之间做出不同实现选择时&#xff0c;会对性能产生显著影响。今天&#xff0c;我们将深入探讨这两种实现的差异&#xff0c;帮助…

基于博客系统的自动化测试项目

目录 一、引言 二、项目背景 三、项目功能 1&#xff09;初始登录界面 2&#xff09;博客首页 3&#xff09;博客详情页 4&#xff09;博客编辑页 四、测试工具 1&#xff09;基础操作系统环境 2&#xff09;浏览器环境 3&#xff09;开发与测试工具环境 4&#xf…

R 语言 eulerr 包绘制韦恩图:比例精准

在数据可视化中,韦恩图是展示多组数据交集关系的常用工具,尤其在生物信息(如基因差异表达分析)、统计分析等领域高频使用。但传统绘图工具常面临椭圆比例失衡、数值显示混乱、样式调整繁琐等问题,而 R 语言的eulerr包恰好能解决这些痛点 —— 它支持按数据比例自动适配图形…

CRYPT32!CryptMsgUpdate函数分析和asn.1 editor nt5inf.cat 的总览信息

0000: 30 83 09 69 2f ; SEQUENCE (9692f Bytes) 0005: 06 09 ; OBJECT_IDENTIFIER (9 Bytes) 0007: | 2a 86 48 86 f7 0d 01 07 02| ; "PKCS 7 已签名 (1.2.840.113549.1.7.2)" 0010: …