今天在做力扣动态规划:带障碍物的不同路径的题时添加链接描述 我在初始化列表时,是这样写的
dp = [[None] * lie]*hang
然后一直提交都不通过,后面在编辑器里面debug才知道,如果其中一个dp[i][0]赋值会引起相同列的元素都发生变化,后来才知道—这个方法会创建一个包含hang个指向同一个列表的引用的列表,即每一行都是同一个列表的引用。因此,如果我们修改其中一个列表的值,其他行的值也会被修改,因为它们引用的是同一个列表。这样的话,当我们执行dp[i][0] = 1时,第i行的第一个元素被赋值为1,而其他行也引用了这个元素,所以其他行的值也会被修改。
因此我们在初始化二维甚至多维列表时,应该这样设计:
dp = [[None] * lie for _ in range(hang)]
最后附加不参考任何题解的代码:
# 63. 不同路径 II
def uniquePathsWithObstacles(obstacleGrid):
"""
:type obstacleGrid: List[List[int]]
:rtype: int
"""
hang = len(obstacleGrid)
lie = len(obstacleGrid[0])
if hang == 1:
for i in range(0, lie):
if obstacleGrid[0][i] == 1:
return 0
return 1
if lie == 1:
for j in range(0, hang):
if obstacleGrid[j][0] == 1:
return 0
return 1
dp = [[None] * lie for _ in range(hang)]
temp1 = hang
temp2 = lie
for i in range(0, hang):
if obstacleGrid[i][0] == 1:
temp1 = i
break
dp[i][0] = 1
for i in range(temp1, hang):
dp[i][0] = 0
for i in range(0, lie):
if obstacleGrid[0][i] == 1:
temp2 = i
break
dp[0][i] = 1
for i in range(temp2, lie):
dp[0][i] = 0
for i in range(1, hang):
for j in range(1, lie):
if obstacleGrid[i][j] == 1:
dp[i][j] = 0
else:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
print(dp)
return dp[hang - 1][lie - 1]
if __name__ == "__main__":
result = uniquePathsWithObstacles([[0,0],[1,1],[0,0]])
print(result)