給定乙個只含非負整數的m*n網格,找到一條從左上角到右下角的可以使數字和最小的路徑。
tip: 你在同一時間只能向下或者向右移動一步
樣例
樣例 1:
輸入: [[1,3,1],[1,5,1],[4,2,1]]
輸出: 7
樣例解釋:
路線為: 1 -> 3 -> 1 -> 1 -> 1。
樣例 2:
輸入: [[1,3,2]]
輸出: 6
解釋:
路線是: 1 -> 3 -> 2
有兩種方案可以實現:
採用遞迴,實現簡單,但是資料大時效能弱。
採用廣度優先搜尋方式,效能較好。
class
solution
//return minpath(grid, 0, 0);
return
minpath
(grid);}
// 遞迴方式搜尋----數量大時,效能較弱。
intminpath
(vectorint>>
&grid,
int i,
int j)
int nright =
0x7fffffff;if
(j +
1< grid[0]
.size()
)int ndown =
0x7fffffff;if
(i +
1< grid.
size()
)return std::
min(nright, ndown)
+ grid[i]
[j];
}// 廣度優先搜尋
intminpath
(vectorint>>
&grid)
}struct positon
;
std::queue p;
// 加入起點
p.push
(positon);
tmp[0]
[0]=
1;int nup =0;
int nleft =0;
while
(p.size()
)else
// 從上邊走過來的距離
if(frn.x >0)
else
// 取兩者最小
if(nleft !=
0x7fffffff
|| nup !=
0x7fffffff
)else
// 右 下節點加入佇列,若已被加入過,則不加入,否則指數型增長
if(frn.y < n -
1&& tmp[frn.x]
[frn.y +1]
!=1))
;}if(frn.x < m -
1&& tmp[frn.x +1]
[frn.y]!=1
));}
//隊頂出隊
p.pop();
}return arr[m -1]
[n -1]
;}};
矩陣最小路徑
原創 問題描述 給出乙個 n x m 的矩陣,從左上角開始每次只能向右走或者向下走,最後達到右下角的位置,路徑中所有數字累加起來就是路徑和,返回所有路徑的最小路徑和。比如 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 最短路徑是12 解題思路 此題屬於動態規劃類題目,我們可以用乙個...
矩陣的最小路徑和
準備校招的!這些是一本書的筆記 程式設計師 面試指南 it名企演算法與資料結構題目最優解 左程雲 給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和 舉例 如果給定的m如下 135 9 813 4 506 1 8...
矩陣的最小路徑和
給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。方法一 遞迴 coding utf 8 defsolution m,l n l m 0 0 if len m 1 and len m 0 1 return l ...