乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。
機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。
現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?
網格中的障礙物和空位置分別用 1 和 0 來表示。
示例 1:
輸入:obstaclegrid = [[0,0,0],[0,1,0],[0,0,0]]
輸出:2
解釋:3x3 網格的正中間有乙個障礙物。
從左上角到右下角一共有 2 條不同的路徑:
向右 -> 向右 -> 向下 -> 向下
向下 -> 向下 -> 向右 -> 向右
示例 2:
輸入:obstaclegrid = [[0,1],[0,0]]
輸出:1
動態規劃
陣列中的障礙物設定為 -1 ,對於下邊緣元素和右邊緣元素,賦值為右邊元素和下邊元素。對於其他位置元素,當下邊元素和右邊元素存在 -1 時,等於不等於 -1 的元素,否則等於下邊元素 和右邊元素之和。 若 (0,0) 元素 不等於 -1 ,返回其值,否則返回0。
class
solution
:def
uniquepathswithobstacles
(self, obstaclegrid: list[list[
int]])
->
int:
m, n =
len(obstaclegrid)
,len
(obstaclegrid[0]
)if m ==
1or n ==1:
return0if
1in[obstaclegrid[i]
[j]for j in
range
(n)for i in
range
(m)]
else
1for i in
range
(m):
for j in
range
(n):
if obstaclegrid[i]
[j]==1:
obstaclegrid[i]
[j]=-1
if obstaclegrid[-1
][-1
]==-1
:return
0else
: obstaclegrid[-1
][-1
]=1for i in
range
(m -1,
-1,-
1):for j in
range
(n -1,
-1,-
1):if i == m -
1and j == n -
1or obstaclegrid[i]
[j]==-1
:continue
if i +
1== m:
obstaclegrid[i]
[j]= obstaclegrid[i]
[j +1]
elif j +
1== n:
obstaclegrid[i]
[j]= obstaclegrid[i +1]
[j]elif obstaclegrid[i]
[j +1]
==-1or obstaclegrid[i +1]
[j]==-1
: obstaclegrid[i]
[j]=
max(obstaclegrid[i +1]
[j], obstaclegrid[i]
[j +1]
)else
: obstaclegrid[i]
[j]= obstaclegrid[i +1]
[j]+ obstaclegrid[i]
[j +1]
return obstaclegrid[0]
[0]if obstaclegrid[0]
[0]!=
-1else
0
LeetCode63 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?網格中的障礙物和空位置分別用 1 和 0 來表示。說明 m...
LeetCode 63 不同路徑
看到這個題目的時候想到的是通過深度優先搜尋演算法進行求解,找到每一條能夠到達finish的路徑,並計數 1,最後得出的計數值即為解。程式設計後提交對於部分測試用例超時,程式如下 class solution if x 1 n 1 if y 1 m 1 int uniquepathswithobsta...
Leetcode 63 不同路徑
描述 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?網格中的障礙物和空位置分別用 1 和 0 來表示。說...