func uniquePathsWithObstacles(obstacleGrid [][]int) int {
n := len(obstacleGrid)
m := len(obstacleGrid[0])
f := make([][]int, n)
for i := 0; i < n; i ++ {
f[i] = make([]int, m)
}
if obstacleGrid[0][0] != 1 {
for i := 0; i < n; i ++ {
if obstacleGrid[i][0] == 1 {
break
}
f[i][0] = 1
}
for j := 0; j < m; j ++ {
if obstacleGrid[0][j] == 1 {
break
}
f[0][j] = 1
}
}
for i := 1; i < n; i ++ {
for j := 1; j < m; j ++ {
if obstacleGrid[i][j] != 1 {
f[i][j] = f[i][j - 1] + f[i - 1][j]
}
}
}
return f[n - 1][m - 1]
}
滚动数组优化成一维的:
func uniquePathsWithObstacles(obstacleGrid [][]int) int {
n := len(obstacleGrid)
m := len(obstacleGrid[0])
f := make([]int, m)
if obstacleGrid[0][0] == 0 {
f[0] = 1
}
for i := 0; i < n; i ++ {
for j := 0; j < m; j ++ {
if obstacleGrid[i][j] == 1 {
f[j] = 0
}
if j - 1 >= 0 && obstacleGrid[i][j] == 0 {
f[j] += f[j - 1]
}
}
}
return f[m - 1]
}