国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

2304. 網(wǎng)格中的最小路徑代價(jià) : 從「圖論最短路」過(guò)渡到「O(1) 空間的原地模擬」

這篇具有很好參考價(jià)值的文章主要介紹了2304. 網(wǎng)格中的最小路徑代價(jià) : 從「圖論最短路」過(guò)渡到「O(1) 空間的原地模擬」。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

題目描述

這是 LeetCode 上的 「2304. 網(wǎng)格中的最小路徑代價(jià)」 ,難度為 「中等」

Tag : 「最短路」、「圖」、「模擬」、「序列 DP」、「動(dòng)態(tài)規(guī)劃」

給你一個(gè)下標(biāo)從 0 開(kāi)始的整數(shù)矩陣 grid,矩陣大小為 m x n,由從 0 的不同整數(shù)組成。

你可以在此矩陣中,從一個(gè)單元格移動(dòng)到下一行的任何其他單元格。

如果你位于單元格 ,且滿足 ,你可以移動(dòng)到 , , ..., 中的任何一個(gè)單元格。注意: 在最后一行中的單元格不能觸發(fā)移動(dòng)。

每次可能的移動(dòng)都需要付出對(duì)應(yīng)的代價(jià),代價(jià)用一個(gè)下標(biāo)從 0 開(kāi)始的二維數(shù)組 moveCost 表示,該數(shù)組大小為 ,其中 moveCost[i][j] 是從值為 i 的單元格移動(dòng)到下一行第 j 列單元格的代價(jià)。從 grid 最后一行的單元格移動(dòng)的代價(jià)可以忽略。

grid 一條路徑的代價(jià)是:所有路徑經(jīng)過(guò)的單元格的值之和加上所有移動(dòng)的代價(jià)之和 。從第一行任意單元格出發(fā),返回到達(dá)最后一行任意單元格的最小路徑代價(jià)。

示例 1: 網(wǎng)格最短路 + 跳躍點(diǎn),后端

輸入:grid?=?[[5,3],[4,0],[2,1]],?moveCost?=?[[9,8],[1,5],[10,12],[18,6],[2,4],[14,3]]

輸出:17

解釋:最小代價(jià)的路徑是?5?->?0?->?1?。
-?路徑途經(jīng)單元格值之和?5?+?0?+?1?=?6?。
-?從?5?移動(dòng)到?0?的代價(jià)為?3?。
-?從?0?移動(dòng)到?1?的代價(jià)為?8?。
路徑總代價(jià)為?6?+?3?+?8?=?17?。

示例 2:

輸入:grid?=?[[5,1,2],[4,0,3]],?moveCost?=?[[12,10,15],[20,23,8],[21,7,1],[8,1,13],[9,10,25],[5,3,2]]

輸出:6

解釋:
最小代價(jià)的路徑是?2?->?3?。?
-?路徑途經(jīng)單元格值之和?2?+?3?=?5?。?
-?從?2?移動(dòng)到?3?的代價(jià)為?1?。?
路徑總代價(jià)為?5?+?1?=?6?。

提示:

  • grid 由從 0m * n - 1 的不同整數(shù)組成

建新圖 + 建虛擬點(diǎn) + 堆優(yōu)化 Dijkstra

?

注意:可以直接使用解法二的方法,但先認(rèn)真看完本做法,再去看解法二,會(huì)有相當(dāng)絲滑的體驗(yàn)。

?

每次移動(dòng),「實(shí)際路徑權(quán)值 = 經(jīng)過(guò)邊的權(quán)值 + 目的地的權(quán)值」。

利用原圖,構(gòu)建新圖:「每個(gè)單元格視為一個(gè)點(diǎn),除最后一行外,每個(gè)點(diǎn)對(duì)下一行的所有點(diǎn)連一條有向邊,邊權(quán) = 原圖中該邊的權(quán)值 + 原圖中該目的地的權(quán)值」

分析新圖中的點(diǎn)邊數(shù)量:

  • 點(diǎn):共 個(gè)點(diǎn),數(shù)量為
  • 邊:不算最后一行,共 個(gè)點(diǎn),這些點(diǎn)與下一行的每個(gè)點(diǎn)均有一條有向邊,合計(jì) 條邊,數(shù)量為

原問(wèn)題轉(zhuǎn)換為:求點(diǎn) 的最短路,其中點(diǎn) 所在位置為第 行,點(diǎn) 所在位置為第 行。

這似乎是一個(gè)「多源匯最短路」問(wèn)題?但求解多源匯最短路的 Floyd 算法是 的,會(huì)超時(shí)。

實(shí)際上,我們也并不真的關(guān)心圖中任意點(diǎn)之間的最短路,僅僅關(guān)心第一行到最后一行的最短路。

因此,「我們可通過(guò)建立“虛擬源點(diǎn)”和“虛擬匯點(diǎn)”的方式,來(lái)將“多源匯最短路”問(wèn)題轉(zhuǎn)換為“單源最短路”問(wèn)題?!?/strong>

具體的,我們創(chuàng)建一個(gè)“虛擬源點(diǎn)”,該點(diǎn)向所有第一行的點(diǎn)連權(quán)值為 的有向邊;同時(shí)創(chuàng)建一個(gè)“虛擬匯點(diǎn)”,最后一行的所有點(diǎn)向該點(diǎn)連權(quán)值為 的有向邊。

問(wèn)題進(jìn)一步轉(zhuǎn)化為:求“虛擬源點(diǎn)”到“虛擬匯點(diǎn)”的最短路。

至此,我們通過(guò) 「建新圖 -> 創(chuàng)建虛擬源匯點(diǎn)(轉(zhuǎn)換為單源最短路)-> 套用單源最短路算法」 解決本題。

將新圖中點(diǎn)的數(shù)量記為 ,邊數(shù)記為 ,樸素 Dijkstra 復(fù)雜度為 ,堆優(yōu)化的 Dijkstra 的復(fù)雜度為 ,當(dāng) (相對(duì)稀疏)時(shí),優(yōu)先使用堆優(yōu)化 Dijkstra。

Java 代碼:

class?Solution?{
????int?N?=?50?*?50?+?2,?M?=?50?*?50?*?50,?idx?=?0,?n;
????int[]?he?=?new?int[N],?e?=?new?int[M],?ne?=?new?int[M],?w?=?new?int[M];
????void?add(int?a,?int?b,?int?c)?{
????????e[idx]?=?b;
????????ne[idx]?=?he[a];
????????w[idx]?=?c;
????????he[a]?=?idx++;
????}
????public?int?minPathCost(int[][]?grid,?int[][]?moveCost)?{
????????int?N?=?grid.length,?M?=?grid[0].length;
????????int?S?=?N?*?M,?T?=?S?+?1;
????????n?=?N?*?M?+?2;
????????Arrays.fill(he,?-1);
????????//「虛擬源點(diǎn)」向「第一行」進(jìn)行連邊
????????for?(int?i?=?0;?i?<?M;?i++)?add(S,?grid[0][i],?grid[0][i]);
????????//?轉(zhuǎn)換原圖
????????for?(int?i?=?0;?i?<?N?-?1;?i++)?{
????????????for?(int?j?=?0;?j?<?M;?j++)?{
????????????????int?a?=?grid[i][j];
????????????????for?(int?k?=?0;?k?<?M;?k++)?{
????????????????????int?b?=?grid[i?+?1][k];
????????????????????add(a,?b,?moveCost[a][k]?+?b);
????????????????}
????????????}
????????}
????????//「最后一行」向「虛擬匯點(diǎn)」進(jìn)行連邊
????????for?(int?i?=?0;?i?<?M;?i++)?add(grid[N?-?1][i],?T,?0);
????????//?最短路
????????int[]?dist?=?dijkstra(S);
????????return?dist[T];
????}
????int[]?dijkstra(int?x)?{
????????//?起始先將所有的點(diǎn)標(biāo)記為「未更新」和「距離為正無(wú)窮」
????????int[]?dist?=?new?int[n];
????????Arrays.fill(dist,?0x3f3f3f3f);
????????boolean[]?vis?=?new?boolean[n];
????????dist[x]?=?0;
????????//?使用「優(yōu)先隊(duì)列」存儲(chǔ)所有可用于更新的點(diǎn)
????????//?以?(點(diǎn)編號(hào),?到起點(diǎn)的距離)?進(jìn)行存儲(chǔ),優(yōu)先彈出「最短距離」較小的點(diǎn)
????????PriorityQueue<int[]>?q?=?new?PriorityQueue<>((a,b)->a[1]-b[1]);
????????q.add(new?int[]{x,?0});
????????while?(!q.isEmpty())?{
????????????//?每次從「優(yōu)先隊(duì)列」中彈出
????????????int[]?poll?=?q.poll();
????????????int?u?=?poll[0],?step?=?poll[1];
????????????//?如果彈出的點(diǎn)被標(biāo)記「已更新」,則跳過(guò)
????????????if?(vis[u])?continue;
????????????//?標(biāo)記該點(diǎn)「已更新」,并使用該點(diǎn)更新其他點(diǎn)的「最短距離」
????????????vis[u]?=?true;
????????????for?(int?i?=?he[u];?i?!=?-1;?i?=?ne[i])?{
????????????????int?j?=?e[i];
????????????????if?(dist[j]?<=?dist[u]?+?w[i])?continue;
????????????????dist[j]?=?dist[u]?+?w[i];
????????????????q.add(new?int[]{j,?dist[j]});
????????????}
????????}
????????return?dist;
????}
}

C++ 代碼:

class?Solution?{
public:
????static?const?int?N?=?50?*?50?+?2,?M?=?50?*?50?*?50;
????int?he[N],?e[M],?ne[M],?w[M],?idx,?n,?INF?=?0x3f3f3f3f;
????void?add(int?a,?int?b,?int?c)?{
????????e[idx]?=?b;
????????ne[idx]?=?he[a];
????????w[idx]?=?c;
????????he[a]?=?idx++;
????}
????int?minPathCost(vector<vector<int>>&?grid,?vector<vector<int>>&?moveCost)?{
????????int?N?=?grid.size(),?M?=?grid[0].size();
????????int?S?=?N?*?M,?T?=?S?+?1;
????????n?=?N?*?M?+?2;
????????fill(he,?he?+?n,?-1);
????????//「虛擬源點(diǎn)」向「第一行」進(jìn)行連邊
????????for?(int?i?=?0;?i?<?M;?i++)?add(S,?grid[0][i],?grid[0][i]);
????????//?轉(zhuǎn)換原圖
????????for?(int?i?=?0;?i?<?N?-?1;?i++)?{
????????????for?(int?j?=?0;?j?<?M;?j++)?{
????????????????int?a?=?grid[i][j];
????????????????for?(int?k?=?0;?k?<?M;?k++)?{
????????????????????int?b?=?grid[i?+?1][k];
????????????????????add(a,?b,?moveCost[a][k]?+?b);
????????????????}
????????????}
????????}
????????//「最后一行」向「虛擬匯點(diǎn)」進(jìn)行連邊
????????for?(int?i?=?0;?i?<?M;?i++)?add(grid[N?-?1][i],?T,?0);
????????//?最短路
????????vector<int>?dist?=?dijkstra(S);
????????return?dist[T];
????}
????vector<int>?dijkstra(int?x)?{
????????vector<int>?dist(n,?0x3f3f3f3f);
????????vector<bool>?vis(n,?false);
????????dist[x]?=?0;
????????//?使用「優(yōu)先隊(duì)列」存儲(chǔ)所有可用于更新的點(diǎn)
????????//?以?(到起點(diǎn)的距離,?點(diǎn)編號(hào))?進(jìn)行存儲(chǔ),優(yōu)先彈出「最短距離」較小的點(diǎn)
????????priority_queue<pair<int,?int>,?vector<pair<int,?int>>,?greater<pair<int,?int>>>?q;
????????q.push({0,?x});
????????while?(!q.empty())?{
????????????//?每次從「優(yōu)先隊(duì)列」中彈出
????????????auto?[step,?u]?=?q.top();
????????????q.pop();
????????????//?如果彈出的點(diǎn)被標(biāo)記「已更新」,則跳過(guò)
????????????if?(vis[u])?continue;
????????????//?標(biāo)記該點(diǎn)「已更新」,并使用該點(diǎn)更新其他點(diǎn)的「最短距離」
????????????vis[u]?=?true;
????????????for?(int?i?=?he[u];?i?!=?-1;?i?=?ne[i])?{
????????????????int?j?=?e[i];
????????????????if?(dist[j]?<=?dist[u]?+?w[i])?continue;
????????????????dist[j]?=?dist[u]?+?w[i];
????????????????q.push({dist[j],?j});
????????????}
????????}
????????return?dist;
????}
};

Python 代碼:

import?heapq

class?Solution:
????def?minPathCost(self,?grid,?moveCost):
????????N,?M?=?len(grid),?len(grid[0])
????????S,?T?=?N?*?M,?N?*?M?+?1
????????n?=?N?*?M?+?2
????????he?=?[-1]?*?n
????????e,?ne,?w?=?[-1]?*?(50?*?50?*?50),?[-1]?*?(50?*?50?*?50),?[-1]?*?(50?*?50?*?50)
????????idx?=?0

????????def?add(a,?b,?c):
????????????nonlocal?idx
????????????e[idx]?=?b
????????????ne[idx]?=?he[a]
????????????w[idx]?=?c
????????????he[a]?=?idx
????????????idx?+=?1

????????def?dijkstra(x):
????????????dist?=?[float('inf')]?*?n
????????????vis?=?[False]?*?n
????????????dist[x]?=?0
????????????#?使用「優(yōu)先隊(duì)列」存儲(chǔ)所有可用于更新的點(diǎn)
????????????#?以?(到起點(diǎn)的距離,?點(diǎn)編號(hào))?進(jìn)行存儲(chǔ),優(yōu)先彈出「最短距離」較小的點(diǎn)
????????????q?=?[(0,?x)]
????????????heapq.heapify(q)
????????????while?q:
????????????????#?每次從「優(yōu)先隊(duì)列」中彈出
????????????????step,?u?=?heapq.heappop(q)
????????????????#?如果彈出的點(diǎn)被標(biāo)記「已更新」,則跳過(guò)
????????????????if?vis[u]:?continue
????????????????#?標(biāo)記該點(diǎn)「已更新」,并使用該點(diǎn)更新其他點(diǎn)的「最短距離」
????????????????vis[u]?=?True
????????????????i?=?he[u]
????????????????while?i?!=?-1:
????????????????????j,?c?=?e[i],?w[i]
????????????????????i?=?ne[i]
????????????????????if?dist[j]?<=?dist[u]?+?c:?continue
????????????????????dist[j]?=?dist[u]?+?c
????????????????????heapq.heappush(q,?(dist[j],?j))
????????????return?dist

????????#「虛擬源點(diǎn)」向「第一行」進(jìn)行連邊
????????for?i?in?range(M):
????????????add(S,?grid[0][i],?grid[0][i])
????????#?轉(zhuǎn)換原圖
????????for?i?in?range(N?-?1):
????????????for?j?in?range(M):
????????????????a?=?grid[i][j]
????????????????for?k?in?range(M):
????????????????????b?=?grid[i?+?1][k]
????????????????????add(a,?b,?moveCost[a][k]?+?b)
????????#「最后一行」向「虛擬匯點(diǎn)」進(jìn)行連邊
????????for?i?in?range(M):
????????????add(grid[N?-?1][i],?T,?0)
????????#?最短路
????????dist?=?dijkstra(S)
????????return?dist[T]
  • 時(shí)間復(fù)雜度: ,其中 為新圖中的點(diǎn)數(shù) , 為新圖中的邊數(shù)
  • 空間復(fù)雜度:

堆優(yōu)化 Dijkstra

什么?你說(shuō)你實(shí)在不想建新圖,也不想搞什么虛擬點(diǎn),就想用你心愛(ài)的 BFS 來(lái)做?!

我懂你意思,但那不叫 BFS

只是將「建新圖」和「建虛擬點(diǎn)」的過(guò)程省掉,仍需要使用優(yōu)先隊(duì)列(堆)來(lái)每次取出當(dāng)前“路徑代價(jià)最小”的點(diǎn)來(lái)進(jìn)行擴(kuò)充,執(zhí)行過(guò)程仍為堆優(yōu)化 Dijkstra 的核心操作。

尤其所謂“省掉” 建新圖 和 建虛擬點(diǎn),真就字面上的“省掉”,并非不存在,因?yàn)閮煞N做法思路是完全一致的??珊?jiǎn)單列舉「本解法」與「解法一」的對(duì)應(yīng)關(guān)系:

  • 起始往隊(duì)列放入首行元素,對(duì)應(yīng)了解法一的“建立虛擬源點(diǎn)”過(guò)程;
  • 從隊(duì)列中取元素出來(lái)擴(kuò)充時(shí),若當(dāng)前元素所在行是最后一行時(shí),用當(dāng)前路徑代價(jià)來(lái)更新答案,對(duì)應(yīng)了解法一的“建立虛擬匯點(diǎn)”過(guò)程;
  • 擴(kuò)充時(shí)直接遍歷列(即下一行的所有點(diǎn)),對(duì)應(yīng)的解法一的“用原圖邊建新圖”的過(guò)程。

Java 代碼:

class?Solution?{
????public?int?minPathCost(int[][]?grid,?int[][]?moveCost)?{
????????int?m?=?grid.length,?n?=?grid[0].length,?INF?=?0x3f3f3f3f,?ans?=?INF;
????????int[][]?dist?=?new?int[m][n];
????????for?(int?i?=?0;?i?<?m;?i++)?{
????????????for?(int?j?=?0;?j?<?n;?j++)?dist[i][j]?=?INF;
????????}
????????PriorityQueue<int[]>?d?=?new?PriorityQueue<>((a,b)->a[2]-b[2]);
????????for?(int?i?=?0;?i?<?n;?i++)?{
????????????d.add(new?int[]{0,?i,?grid[0][i]});
????????????dist[0][i]?=?grid[0][i];
????????}
????????while?(!d.isEmpty())?{
????????????int[]?info?=?d.poll();
????????????int?x?=?info[0],?y?=?info[1],?cur?=?info[2];
????????????if?(x?==?m?-?1)?{
????????????????ans?=?Math.min(ans,?cur);
????????????????continue;
????????????}
????????????for?(int?i?=?0;?i?<?n;?i++)?{
????????????????int?step?=?moveCost[grid[x][y]][i],?ne?=?grid[x?+?1][i];
????????????????int?tot?=?cur?+?step?+?ne;
????????????????if?(tot?>=?ans?||?dist[x?+?1][i]?<=?tot)?continue;
????????????????dist[x?+?1][i]?=?tot;
????????????????d.add(new?int[]{x?+?1,?i,?tot});
????????????}
????????}
????????return?ans;
????}
}

C++ 代碼:

class?Solution?{
public:
????int?minPathCost(vector<vector<int>>&?grid,?vector<vector<int>>&?moveCost)?{
????????int?m?=?grid.size(),?n?=?grid[0].size(),?INF?=?0x3f3f3f3f,?ans?=?INF;
????????vector<vector<int>>?dist(m,?vector<int>(n,?INF));
????????priority_queue<vector<int>,?vector<vector<int>>,?greater<vector<int>>>?pq;
????????for?(int?i?=?0;?i?<?n;?i++)?{
????????????pq.push({0,?i,?grid[0][i]});
????????????dist[0][i]?=?grid[0][i];
????????}
????????while?(!pq.empty())?{
????????????vector<int>?info?=?pq.top();
????????????pq.pop();
????????????int?x?=?info[0],?y?=?info[1],?cur?=?info[2];
????????????if?(x?==?m?-?1)?{
????????????????ans?=?min(ans,?cur);
????????????????continue;
????????????}
????????????for?(int?i?=?0;?i?<?n;?i++)?{
????????????????int?step?=?moveCost[grid[x][y]][i],?ne?=?grid[x?+?1][i];
????????????????int?tot?=?cur?+?step?+?ne;
????????????????if?(tot?>=?ans?||?dist[x?+?1][i]?<=?tot)?continue;
????????????????dist[x?+?1][i]?=?tot;
????????????????pq.push({x?+?1,?i,?tot});
????????????}
????????}
????????return?ans;
????}
};

Python 代碼:

class?Solution:
????def?minPathCost(self,?grid,?moveCost):
????????m,?n,?INF?=?len(grid),?len(grid[0]),?float('inf')
????????ans?=?INF
????????dist?=?[[INF]?*?n?for?_?in?range(m)]
????????for?i?in?range(n):
????????????dist[0][i]?=?grid[0][i]
????????pq?=?[(0,?i,?grid[0][i])?for?i?in?range(n)]
????????while?pq:
????????????x,?y,?cur?=?heapq.heappop(pq)
????????????if?x?==?m?-?1:
????????????????ans?=?min(ans,?cur)
????????????????continue
????????????for?i?in?range(n):
????????????????step,?ne?=?moveCost[grid[x][y]][i],?grid[x?+?1][i]
????????????????tot?=?cur?+?step?+?ne
????????????????if?tot?>=?ans?or?dist[x?+?1][i]?<=?tot:?continue
????????????????dist[x?+?1][i]?=?tot
????????????????heapq.heappush(pq,?(x?+?1,?i,?tot))
????????return?ans
  • 時(shí)間復(fù)雜度: ,其中 為新圖中的點(diǎn)數(shù) , 為新圖中的邊數(shù)
  • 空間復(fù)雜度:

原地模擬

什么?你說(shuō)你連圖論的方法都不想用,想就著題意做一遍?

可以。甚至當(dāng)你調(diào)整更新方向,還能利用已有的 grid,實(shí)現(xiàn)原地模擬。

具體的,我們將“從上往下走”調(diào)整為“從下往上走”,這樣可以確保當(dāng)我們使用底下一行 來(lái)更新當(dāng)前行 時(shí),所用到的 不會(huì)被覆蓋。

Java 代碼:

class?Solution?{
????public?int?minPathCost(int[][]?grid,?int[][]?moveCost)?{
????????int?m?=?grid.length,?n?=?grid[0].length,?INF?=?0x3f3f3f3f,?ans?=?INF;
????????for?(int?i?=?m?-?2;?i?>=?0;?i--)?{
????????????for?(int?j?=?0;?j?<?n;?j++)?{
????????????????int?cur?=?INF;
????????????????for?(int?k?=?0;?k?<?n;?k++)?cur?=?Math.min(cur,?grid[i?+?1][k]?+?moveCost[grid[i][j]][k]);
????????????????grid[i][j]?+=?cur;
????????????}
????????}
????????for?(int?i?=?0;?i?<?n;?i++)?ans?=?Math.min(ans,?grid[0][i]);
????????return?ans;
????}
}

C++ 代碼:

class?Solution?{
public:
????int?minPathCost(vector<vector<int>>&?grid,?vector<vector<int>>&?moveCost)?{
????????int?m?=?grid.size(),?n?=?grid[0].size(),?INF?=?INT_MAX,?ans?=?INF;
????????for?(int?i?=?m?-?2;?i?>=?0;?i--)?{
????????????for?(int?j?=?0;?j?<?n;?j++)?{
????????????????int?cur?=?INF;
????????????????for?(int?k?=?0;?k?<?n;?k++)?cur?=?min(cur,?grid[i?+?1][k]?+?moveCost[grid[i][j]][k]);
????????????????grid[i][j]?+=?cur;
????????????}
????????}
????????for?(int?i?=?0;?i?<?n;?i++)?ans?=?min(ans,?grid[0][i]);
????????return?ans;
????}
};

Python 代碼:

class?Solution:
????def?minPathCost(self,?grid,?moveCost):
????????m,?n?=?len(grid),?len(grid[0])
????????for?i?in?range(m?-?2,?-1,?-1):
????????????for?j?in?range(n):
????????????????grid[i][j]?+=?min([grid[i?+?1][k]?+?moveCost[grid[i][j]][k]?for?k?in?range(n)])
????????return?min([grid[0][i]?for?i?in?range(n)])

TypeScript 代碼:

function?minPathCost(grid:?number[][],?moveCost:?number[][]):?number?{
????let?m?=?grid.length,?n?=?grid[0].length,?INF?=?0x3f3f3f3f,?ans?=?INF;
????for?(let?i?=?m?-?2;?i?>=?0;?i--)?{
????????for?(let?j?=?0;?j?<?n;?j++)?{
????????????let?cur?=?INF;
????????????for?(let?k?=?0;?k?<?n;?k++)?cur?=?Math.min(cur,?grid[i?+?1][k]?+?moveCost[grid[i][j]][k]);
????????????grid[i][j]?+=?cur;
????????}
????}
????for?(let?i?=?0;?i?<?n;?i++)?ans?=?Math.min(ans,?grid[0][i]);
????return?ans;
};
  • 時(shí)間復(fù)雜度: ,其中 分別代表給定 grid 的長(zhǎng)寬
  • 空間復(fù)雜度:

最后

這是我們「刷穿 LeetCode」系列文章的第 No.2304 篇,系列開(kāi)始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道題目,部分是有鎖題,我們將先把所有不帶鎖的題目刷完。

在這個(gè)系列文章里面,除了講解解題思路以外,還會(huì)盡可能給出最為簡(jiǎn)潔的代碼。如果涉及通解還會(huì)相應(yīng)的代碼模板。

為了方便各位同學(xué)能夠電腦上進(jìn)行調(diào)試和提交代碼,我建立了相關(guān)的倉(cāng)庫(kù):https://github.com/SharingSource/LogicStack-LeetCode 。

在倉(cāng)庫(kù)地址里,你可以看到系列文章的題解鏈接、系列文章的相應(yīng)代碼、LeetCode 原題鏈接和其他優(yōu)選題解。

更多更全更熱門(mén)的「筆試/面試」相關(guān)資料可訪問(wèn)排版精美的 合集新基地 ????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-818136.html

到了這里,關(guān)于2304. 網(wǎng)格中的最小路徑代價(jià) : 從「圖論最短路」過(guò)渡到「O(1) 空間的原地模擬」的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 圖論與算法(遍歷、最小生成樹(shù)、最短路徑)

    圖論與算法(遍歷、最小生成樹(shù)、最短路徑)

    圖是由頂點(diǎn)集合及頂點(diǎn)間的關(guān)系組成的一種數(shù)據(jù)結(jié)構(gòu):G = (V, E),其中:頂點(diǎn)集合V = {x|x屬于某個(gè)數(shù)據(jù)對(duì)象集}是有窮非空集合;E = {(x,y)|x,y屬于V}或者E = {x, y|x,y屬于V Path(x, y)}是頂點(diǎn)間關(guān)系的有窮集合,也叫做邊的集合。(x, y)表示x到y(tǒng)的一條雙向通路,即(x, y)是無(wú)方向的;Path

    2024年04月14日
    瀏覽(24)
  • 圖論基本知識(shí)--->最短路練習(xí)--->最小生成樹(shù)

    自環(huán) 重邊 孤點(diǎn) 簡(jiǎn)單圖 有向圖,無(wú)向圖 簡(jiǎn)單圖: 無(wú)向圖的度數(shù) 有向圖的度數(shù):出度,入度 每個(gè)圖的最大度,最小度 完全圖(無(wú)向圖): 完全圖(有向圖): 子圖,生成子圖: 補(bǔ)圖:點(diǎn)集相同,邊集不相交,并集為完全圖 連通圖,連通塊: 圖的儲(chǔ)存方式:鄰接矩陣,鄰

    2024年01月23日
    瀏覽(28)
  • 【C++ 實(shí)現(xiàn)】圖論概念,最小生成樹(shù),單/多源最短路徑實(shí)現(xiàn)

    【C++ 實(shí)現(xiàn)】圖論概念,最小生成樹(shù),單/多源最短路徑實(shí)現(xiàn)

    首先節(jié)點(diǎn)的存取,V是節(jié)點(diǎn)key,vectorpairV,V map;其實(shí)已經(jīng)能表達(dá)一個(gè)圖了,但是這樣保存節(jié)點(diǎn)對(duì)我們使用來(lái)說(shuō)會(huì)導(dǎo)致復(fù)雜度高。 常用保存節(jié)點(diǎn)的方式,有矩陣和鄰接表。 矩陣的優(yōu)點(diǎn):O(1) 時(shí)間找到兩點(diǎn)是否相連以及他們的權(quán)值。 矩陣的缺點(diǎn):找一點(diǎn)相鄰的所有節(jié)點(diǎn)的時(shí)候是O(N

    2024年02月13日
    瀏覽(21)
  • 【算法入門(mén)&圖論】【模板】拓?fù)渑判騶【模板】單源最短路2 |最小生成樹(shù)

    【算法入門(mén)&圖論】【模板】拓?fù)渑判騶【模板】單源最短路2 |最小生成樹(shù)

    ?作者簡(jiǎn)介:熱愛(ài)后端語(yǔ)言的大學(xué)生,CSDN內(nèi)容合伙人 ?精品專欄:C++面向?qū)ο???系列專欄:算法百煉成神 本專欄收錄的均為??途W(wǎng)的算法題目,內(nèi)含鏈表、雙指針、遞歸、動(dòng)態(tài)規(guī)劃、基本數(shù)據(jù)結(jié)構(gòu)等算法思想的具體運(yùn)用。??途W(wǎng)不僅有大量的經(jīng)典算法題目,也有大廠的面

    2024年02月03日
    瀏覽(64)
  • 【圖論C++】Floyd算法(多源最短路徑長(zhǎng) 及 完整路徑)

    【圖論C++】Floyd算法(多源最短路徑長(zhǎng) 及 完整路徑)

    UpData Log?? 2023.9.29 更新進(jìn)行中 Statement0?? 一起進(jìn)步 Statement1?? 有些描述可能不夠標(biāo)準(zhǔn),但能達(dá)其意 常見(jiàn)的有: DJ算法 、 Floyd算法 、 A*算法 、 Bellman-Ford 算法 、 SPFA算法 其中 A*算法 是 DJ算法 的plus版, SPFA算法 是 Bellman-Ford 算法 的plus版 算法名稱 DJ算法 Floyd算法 SPFA算法

    2024年02月19日
    瀏覽(20)
  • 數(shù)學(xué)建模十大算法04—圖論算法(最短路徑、最小生成樹(shù)、最大流問(wèn)題、二分圖)

    數(shù)學(xué)建模十大算法04—圖論算法(最短路徑、最小生成樹(shù)、最大流問(wèn)題、二分圖)

    一、最短路徑問(wèn)題 從圖中的某個(gè)頂點(diǎn)出發(fā),到達(dá)另一個(gè)頂點(diǎn)的 所經(jīng)過(guò)的邊的權(quán)重之和最小 的一條路徑。 1.1 兩個(gè)指定頂點(diǎn)之間的最短路徑 問(wèn)題如下:給出了一個(gè)連接若干個(gè)城鎮(zhèn)的鐵路網(wǎng)絡(luò),在這個(gè)網(wǎng)絡(luò)的兩個(gè)指定城鎮(zhèn)間,求一條最短鐵路線。 1.1.1 Dijkstra算法 迪杰斯特拉(D

    2024年02月02日
    瀏覽(82)
  • 第三章 圖論 No.3 flody之多源匯最短路,傳遞閉包,最小環(huán)與倍增

    第三章 圖論 No.3 flody之多源匯最短路,傳遞閉包,最小環(huán)與倍增

    flody的四個(gè)應(yīng)用: 多源匯最短路 傳遞閉包 找最小環(huán) 恰好經(jīng)過(guò)k條邊的最短路 倍增 多源匯最短路:1125. 牛的旅行 1125. 牛的旅行 - AcWing題庫(kù) 直徑概念:同一連通塊中,兩個(gè)距離最遠(yuǎn)的點(diǎn)之間的距離 如何求直徑?由于圖中存在著兩個(gè)連通塊,所以直接對(duì)全圖做一個(gè)flody,就能更

    2024年02月14日
    瀏覽(27)
  • 【圖論 單源最短路】100276. 最短路徑中的邊

    【圖論 單源最短路】100276. 最短路徑中的邊

    單源最短路 圖論知識(shí)匯總 給你一個(gè) n 個(gè)節(jié)點(diǎn)的無(wú)向帶權(quán)圖,節(jié)點(diǎn)編號(hào)為 0 到 n - 1 。圖中總共有 m 條邊,用二維數(shù)組 edges 表示,其中 edges[i] = [ai, bi, wi] 表示節(jié)點(diǎn) ai 和 bi 之間有一條邊權(quán)為 wi 的邊。 對(duì)于節(jié)點(diǎn) 0 為出發(fā)點(diǎn),節(jié)點(diǎn) n - 1 為結(jié)束點(diǎn)的所有最短路,你需要返回一個(gè)長(zhǎng)度

    2024年04月22日
    瀏覽(24)
  • 【圖論】BFS中的最短路模型

    【圖論】BFS中的最短路模型

    算法提高課筆記 BFS可以解決邊權(quán)為1的最短路問(wèn)題,下面是相關(guān)例題 將源點(diǎn)在開(kāi)始時(shí)存進(jìn)隊(duì)列 原題鏈接 給定一個(gè) n×n 的二維數(shù)組,如下所示: 它表示一個(gè)迷宮,其中的1表示墻壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求編程序找出從左上角到右下角的最

    2024年02月14日
    瀏覽(20)
  • 64. 最小路徑和:給定一個(gè)包含非負(fù)整數(shù)的 m x n 網(wǎng)格 grid ,請(qǐng)找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。 說(shuō)明:每次只能向下或者向右移動(dòng)一步。

    64. 最小路徑和:給定一個(gè)包含非負(fù)整數(shù)的 m x n 網(wǎng)格 grid ,請(qǐng)找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。 說(shuō)明:每次只能向下或者向右移動(dòng)一步。

    給定一個(gè)包含非負(fù)整數(shù)的 m x n 網(wǎng)格 grid ,請(qǐng)找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。 說(shuō)明:每次只能向下或者向右移動(dòng)一步。 使用動(dòng)態(tài)規(guī)劃的方法解決: 路徑的方向只能是向下或向右 網(wǎng)格的第一行 的每個(gè)元素只能從左上角元素開(kāi)始向右移動(dòng)到達(dá)

    2024年02月08日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包