LeetCode 1631. 最小體力消耗路徑:廣度優先搜索BFS

【LetMeFly】1631.最小體力消耗路徑:廣度優先搜索BFS

力扣題目鏈接:https://leetcode.cn/problems/path-with-minimum-effort/

你準備參加一場遠足活動。給你一個二維?rows x columns?的地圖?heights?,其中?heights[row][col]?表示格子?(row, col)?的高度。一開始你在最左上角的格子?(0, 0)?,且你希望去最右下角的格子?(rows-1, columns-1)?(注意下標從 0 開始編號)。你每次可以往 ?四個方向之一移動,你想要找到耗費 體力 最小的一條路徑。

一條路徑耗費的 體力值?是路徑上相鄰格子之間 高度差絕對值?的 最大值?決定的。

請你返回從左上角走到右下角的最小?體力消耗值?。

?

示例 1:

輸入:heights = [[1,2,2],[3,8,2],[5,3,5]]
輸出:2
解釋:路徑 [1,3,5,3,5] 連續格子的差值絕對值最大為 2 。
這條路徑比路徑 [1,2,2,2,5] 更優,因為另一條路徑差值最大值為 3 。

示例 2:

輸入:heights = [[1,2,3],[3,8,4],[5,3,5]]
輸出:1
解釋:路徑 [1,2,3,4,5] 的相鄰格子差值絕對值最大為 1 ,比路徑 [1,3,5,3,5] 更優。

示例 3:

輸入:heights = [[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,2,1],[1,1,1,2,1]]
輸出:0
解釋:上圖所示路徑不需要消耗任何體力。

?

提示:

  • rows == heights.length
  • columns == heights[i].length
  • 1 <= rows, columns <= 100
  • 1 <= heights[i][j] <= 106

方法一:廣度優先搜索BFS

首先我們可以構造一個圖,圖中頂點是矩陣中的點,圖中的邊是矩陣中相鄰點的絕對值之差。

這樣,我們只需要從起點0開始,使用一個優先隊列進行廣度優先搜索。每次找出未遍歷的點中與已遍歷的點中絕對值之差最小的點。入隊時將“點的位置”和“從起點到該點的最大絕對值之差”入隊。

最終返回最后一個位置距離起點的最大絕對值之差即為答案。

  • 時間復雜度 O ( n m log ? n m ) O(nm\log nm) O(nmlognm),其中 s i z e ( g r a p h ) = n × m size(graph)=n\times m size(graph)=n×m
  • 空間復雜度 O ( n m ) O(nm) O(nm)

AC代碼

C++
const int directions[4][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};class Solution {
public:int minimumEffortPath(vector<vector<int>>& heights) {int n = heights.size(), m = heights[0].size();vector<vector<pair<int, int>>> graph(n * m);  // graph[i]: [[j, 5], [k, 3]]for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {for (int d = 0; d < 4; d++) {int ti = i + directions[d][0], tj = j + directions[d][1];if (ti < 0 || ti >= n || tj < 0 || tj >= m) {continue;}int diff = abs(heights[i][j] - heights[ti][tj]);int x = i * m + j, y = ti * m + tj;graph[x].push_back({y, diff});}}}auto cmp = [](const pair<int, int>& a, const pair<int, int>& b) {return a.second > b.second;};priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pq(cmp);pq.push({0, 0});vector<int> ans(n * m, 1e9);  // 從0到i的最大絕對值之差ans[0] = 0;while (pq.size()) {auto [index, diff] = pq.top();pq.pop();for (auto [toIndex, toDiff] : graph[index]) {int nextDiff = max(diff, toDiff);if (ans[toIndex] > nextDiff) {ans[toIndex] = nextDiff;pq.push({toIndex, nextDiff});}}}return ans.back();}
};
Python
# from typing import List
# import heapqdirections = [[-1, 0], [1, 0], [0, -1], [0, 1]]class Solution:def minimumEffortPath(self, heights: List[List[int]]) -> int:n, m = len(heights), len(heights[0])graph = [[] for _ in range(n * m)]for i in range(n):for j in range(m):for di, dj in directions:ti, tj = i + di, j + djif ti < 0 or ti >= n or tj < 0 or tj >= m:continuegraph[i * m + j].append((ti * m + tj, abs(heights[ti][tj] - heights[i][j])))pq = [(0, 0)]ans = [1000000000] * (n * m)ans[0] = 0while pq:thisDiff, thisNode = heapq.heappop(pq)for toNode, toDiff in graph[thisNode]:newDiff = max(thisDiff, toDiff)if ans[toNode] > newDiff:ans[toNode] = newDiffheapq.heappush(pq, (newDiff, toNode))# print(thisNode, toNode, newDiff)return ans[-1]

同步發文于CSDN,原創不易,轉載經作者同意后請附上原文鏈接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/134934684

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214221.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

視頻如何提取文字?這四個方法一鍵提取視頻文案

視頻如何提取文字&#xff1f;你用過哪些視頻提取工具&#xff1f;視頻轉文字工具&#xff0c;又稱為語音識別軟件&#xff0c;是一款能夠將視頻中的語音或對話轉化為文字的實用工具。它運用了尖端的聲音識別和語言理解技術&#xff0c;能精準地捕捉視頻中的音頻&#xff0c;并…

弧形導軌的工作原理

弧形導軌是一種能夠將物體沿著弧形軌道運動的裝置&#xff0c;它由個弧形軌道和沿著軌道運動的物體組成&#xff0c;弧形導軌的工作原理是利用軌道的形狀和物體的運動方式來實現運動&#xff0c;當物體處于軌道上時&#xff0c;它會受到軌道的引導&#xff0c;從而沿著軌道的弧…

Nginx正則表達式

目錄 1.nginx常用的正則表達式 2.location location 大致可以分為三類 location 常用的匹配規則 location 優先級 location 示例說明 優先級總結 3.rewrite rewrite功能 rewrite跳轉實現 rewrite執行順序 語法格式 rewrite示例 實例1&#xff1a; 實例2&#xf…

生活小記錄

上個月項目總算上線了&#xff0c;節奏也慢慢調整正常。發現自己好久沒有記錄生活點滴了&#xff0c;正好寫寫。其實&#xff0c;最近這段日子發生的事情還是挺多的。 流感 媳婦11.24得流感&#xff0c;這件事情特別好笑&#xff0c;大晚上她和我妹妹想喝酒試試&#xff0c;結…

【Python必做100題】之第六題(求圓的周長)

圓的周長公式&#xff1a;C 2 * pi * r 代碼如下&#xff1a; pi 3.14 r float(input("請輸入圓的半徑&#xff1a;")) c 2 * pi *r print(f"圓的周長為{c}") 運行截圖&#xff1a; 總結 1、圓周長的公式&#xff1a;C 2 * pi * r 2、輸出結果注意…

webrtc 工具類

直接上代碼&#xff1b;webrtc 工具類 package com.example.mqttdome;import android.app.Activity; import android.content.Context; import android.content.Intent; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionMa…

API低代碼開發平臺的實際應用及好處

API低代碼開發平臺是一種快速開發工具&#xff0c;可以幫助企業快速構建和部署應用程序&#xff0c;并提供易于使用的API集成。 實際應用 API低代碼開發平臺的應用范圍非常廣泛&#xff0c;包括但不限于以下幾個方面&#xff1a; 企業級應用程序開發&#xff1a;API低代碼開發…

TypeScript中的類型縮小、類型謂詞

一. 概覽 TypeScript中的類型縮小的方式有typeof、in等方式進行類型縮小。 二. 類型縮小 typeof function test(a: string| number | string []) {if(a) {if(typeof a string) {} else if(typeof a number) {}} }in關鍵字 nterface ISideBar {hide: () >void }interf…

mybatis-plus查詢的字段和mysql關鍵字重名

先看一下這個 TableField("show") 這個注解表示當前屬性對應在數據庫的字段為show&#xff0c;但是show在mysql中為關鍵字&#xff0c;直接查詢會導致語法錯誤 正確寫法應該是 但寫sql由和mybatis-plus理念相違背&#xff0c; 并且無法輕松創建對應方法&#xff0…

第8課 SQL入門之使用數據處理函數

文章目錄 8.1 函數8.2 使用函數8.2.1 文本處理函數8.2.2 日期和時間處理函數8.2.3 數值處理函數 表8-3 常用數值處理函數 這一課介紹什么是函數&#xff0c;DBMS支持何種函數&#xff0c;以及如何使用這些函數&#xff1b;還將講解為什么SQL函數的使用可能會帶來問題。 8.1 函數…

數據結構之----邏輯結構、物理結構

數據結構之----邏輯結構、物理結構 目前我們常見的數據結構分別有&#xff1a; 數組、鏈表、棧、隊列、哈希表、樹、堆、圖 而它們可以從 邏輯結構和物理結構兩個維度進行分類。 什么是邏輯結構&#xff1f; 邏輯結構是指數據元素之間的邏輯關系&#xff0c;而邏輯結構又分為…

HCIA-H12-811題目解析(5)

1、【單選題】 以下關于Hybrid端口說法正確的有&#xff1f; 2、【單選題】使用命令"vlan batch 10 20"和"valn batch 10 to 20"&#xff0c;分別能創建的vlan數量是&#xff1f;&#xff08;&#xff09; 3、【單選題】二層ACL的編號范圍是&#xff1f;…

Scala日志log4j,序列化Gson

一、日志輸出log4j 1. Scala中配置log4j依賴 對于 Maven 項目,可以在 pom.xml 文件中添加以下內容: <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> </dependency>2.創建…

VueUse工具庫

VueUse VueUse不是Vue.use&#xff0c;它是為Vue 2和3服務的一套Vue Composition API的常用工具集&#xff0c;是目前世界上Star最高的同類型庫之一。它的初衷就是將一切原本并不支持響應式的JS API變得支持響應式&#xff0c;省去程序員自己寫相關代碼。 VueUse 是一個基于 …

Java畢業設計 SSM SpringBoot 在線學習系統

Java畢業設計 SSM SpringBoot 在線學習系統 SSM SpringBoot 在線學習系統 功能介紹 首頁 圖片輪播 視頻推薦 在線學習 學習介紹 評論 收藏 資料中心 資料詳情 下載資料 話題討論 文檔發布 試題中心 系統公告 登錄 注冊學生 個人中心 試題記錄 錯題本 我的收藏 算法演示 結果分…

C語言 害死人不償命的(3n+1)算法 挖掘機技術哪家強 選擇排序 貪心算法

1.害死人不償命的&#xff08;3n1)算法 卡拉茲( Calatz)猜想: 對任何一個自然數n,如果它是偶數,那么把它砍掉一半;如果它是奇數,那么把(3n1)砍掉一半。這樣一直反復砍下去,最后一定在某一步得到n1。卡拉茲在1950年的世界數學家大會上公布了這個猜想,傳說當時耶魯大學師生齊動員…

持續集成交付CICD:Jenkins使用GitLab共享庫實現前后端項目Sonarqube

目錄 一、實驗 1.Jenkins使用GitLab共享庫實現后端項目Sonarqube 2.優化GitLab共享庫 3.Jenkins使用GitLab共享庫實現前端項目Sonarqube 4.Jenkins通過插件方式進行優化 二、問題 1.sonar-scanner 未找到命令 2.npm 未找到命令 一、實驗 1.Jenkins使用GitLab共享庫實現…

Vue學習筆記-Vue3中ref和reactive函數的使用

前言 為了讓vue3中的數據變成響應式&#xff0c;需要使用ref,reactive函數 ref函數使用方式 導入ref函數 import {ref} from vue在setup函數中&#xff0c;將需要響應式的數據通過ref函數進行包裝&#xff0c;修改響應式數據時&#xff0c;需要通過: ref包裝的響應式對象.val…

Flink之遲到的數據

遲到數據的處理 推遲水位線推進: WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(2))設置窗口延遲關閉&#xff1a;.allowedLateness(Time.seconds(3))使用側流接收遲到的數據: .sideOutputLateData(lateData) public class Flink12_LateDataC…

力扣編程題算法初階之雙指針算法+代碼分析

目錄 第一題&#xff1a;復寫零 第二題&#xff1a;快樂數&#xff1a; 第三題&#xff1a;盛水最多的容器 第四題&#xff1a;有效三角形的個數 第一題&#xff1a;復寫零 力扣&#xff08;LeetCode&#xff09;官網 - 全球極客摯愛的技術成長平臺 思路&#xff1a; 上期…