62.不同路径
代码随想录:62.不同路径
Leetcode:62.不同路径
做题
注意初始化就行。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [[1] * n for _ in range(m)]
for i in range(1, m):
for j in range(1, n):
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[m-1][n-1]
时间复杂度:O(m × n)
空间复杂度:O(m × n)
看文章
用一个一维数组(也可以理解是滚动数组)可以降低空间复杂度。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# 创建一个一维列表用于存储每列的唯一路径数
dp = [1] * n
# 计算每个单元格的唯一路径数
for j in range(1, m):
for i in range(1, n):
dp[i] += dp[i - 1]
# 返回右下角单元格的唯一路径数
return dp[n - 1]
时间复杂度:O(m × n)
空间复杂度:O(n)
还可以使用数论,但比较难。
63. 不同路径 II
代码随想录:63. 不同路径 II
Leetcode:63. 不同路径 II
做题
在dp数组计算中,碰到障碍物就赋值为0;在初始化中同理。
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m, n = len(obstacleGrid), len(obstacleGrid[0])
dp = [[0] * n for _ in range(m)]
if obstacleGrid[0][0] == 1 or obstacleGrid[m-1][n-1] == 1:
return 0
else:
dp[0][0] = 1
for i in range(1, m):
if obstacleGrid[i][0] == 1:
dp[i][0] = 0
else:
dp[i][0] = dp[i-1][0]
for j in range(1, n):
if obstacleGrid[0][j] == 1:
dp[0][j] = 0
else:
dp[0][j] = dp[0][j-1]
for i in range(1, m):
for j in range(1, n):
if obstacleGrid[i][j] == 1:
dp[i][j] = 0
else:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[m-1][n-1]
时间复杂度:O(n × m),n、m 分别为obstacleGrid 长度和宽度
空间复杂度:O(n × m)
看文章
同样可以用滚动数组降低空间复杂度。
以往忽略的知识点小结
- 用滚动数组降低空间复杂度
个人体会
完成时间:50min。
心得:看过动规的基础上,今天也AC了,准备迎接之后的挑战。