63.go 1.1 KB

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