LeetCode 317 離建筑物最近的距離

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: …