62.不同路径
dp[i][j] 表示从(0 ,0)出发到(i, j) 有dp[i][j]的路径数
边界值处理,(0 ,0)
到(i,0)或(0, j)
,只有一条路径
对于当前位置,只能由左方和上方
位置到达,故有状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
func uniquePaths(m int, n int) int {
dp := make([][]int, m)
for i, _ := range dp {
dp[i] = make([]int, n)
}
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if i*j == 0 {
dp[i][j] = 1
} else {
dp[i][j] = dp[i-1][j] + dp[i][j-1]
}
}
}
return dp[m-1][n-1]
}
63.不同路径II
若起点或者终点为障碍物,直接返回0;
边界值处理,(0 ,0)
到(i,0)或(0, j)
,若不遇到障碍物,只有1条路径,若遇到障碍物,到达当前位置及之后位置路径数为0。
若遇到障碍物,到达当前位置(i, j)
的路径数dp[i][j]=0
,否则dp[i][j] = dp[i-1][j] + dp[i][j-1]
func uniquePathsWithObstacles(obstacleGrid [][]int) int {
m, n := len(obstacleGrid), len(obstacleGrid[0])
dp := make([][]int, m)
if obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1 {
return 0
}
for i, _ := range dp {
dp[i] = make([]int, n)
}
for i := 0; i < m && obstacleGrid[i][0] == 0; i++ {
dp[i][0] = 1
}
for j := 0; j < n && obstacleGrid[0][j] == 0; j++ {
dp[0][j] = 1
}
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
if obstacleGrid[i][j] != 1 {
dp[i][j] = dp[i-1][j] + dp[i][j-1]
}
}
}
return dp[m-1][n-1]
}
空间优化:滑动数组
代码随想录文章详解
总结
今天的题还好哇!