63.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package main
  2. func uniquePathsWithObstacles(obstacleGrid [][]int) int {
  3. m, n := len(obstacleGrid), len(obstacleGrid[0])
  4. // only one row/col
  5. if m == 1 || n == 1 {
  6. for i := 0; i < m; i++ {
  7. for j := 0; j < n; j++ {
  8. if obstacleGrid[i][j] == 1 {
  9. return 0
  10. }
  11. }
  12. }
  13. return 1
  14. }
  15. grid := make([][]int, m)
  16. grid[0] = make([]int, n)
  17. if obstacleGrid[0][0] == 1 {
  18. return 0
  19. }
  20. grid[0][0] = 1
  21. // first row
  22. for i := 1; i < n; i++ {
  23. if obstacleGrid[0][i] == 1 {
  24. break
  25. }
  26. grid[0][i] = 1
  27. }
  28. // first col
  29. for i := 1; i < m; i++ {
  30. grid[i] = make([]int, n)
  31. if obstacleGrid[i][0] == 1 {
  32. grid[i][0] = 0
  33. continue
  34. }
  35. grid[i][0] = grid[i-1][0]
  36. }
  37. for i := 1; i < m; i++ {
  38. for j := 1; j < n; j++ {
  39. if obstacleGrid[i][j] == 1 {
  40. grid[i][j] = 0
  41. } else {
  42. grid[i][j] = grid[i-1][j] + grid[i][j-1]
  43. }
  44. }
  45. }
  46. return grid[m-1][n-1]
  47. }
  48. /* func main() {
  49. o1 := [][]int{
  50. {0, 0, 0},
  51. {0, 1, 0},
  52. {0, 0, 0},
  53. }
  54. fmt.Println(uniquePathsWithObstacles(o1))
  55. o2 := [][]int{
  56. {0, 0, 1},
  57. {0, 0, 0},
  58. {0, 0, 0},
  59. }
  60. fmt.Println(uniquePathsWithObstacles(o2))
  61. } */