403.frog-jump.go 632 B

12345678910111213141516171819202122232425262728293031323334
  1. func canCross(stones []int) bool {
  2. n := len(stones)
  3. m := make(map[int]int)
  4. for i := 1; i < n; i++ {
  5. m[stones[i]] = i
  6. }
  7. steps := make([][]int, n)
  8. steps[0] = []int{0}
  9. return dfs(stones, m, n, 0, &steps)
  10. }
  11. func dfs(stones []int, m map[int]int, n, i int, steps *[][]int) bool {
  12. if i == n-1 {
  13. return true
  14. }
  15. for _, l := range (*steps)[i] {
  16. for j := maxInt(1, l-1); j <= l+1; j++ {
  17. if idx, ok := m[stones[i]+j]; ok {
  18. (*steps)[idx] = append((*steps)[idx], j)
  19. if dfs(stones, m, n, idx, steps) {
  20. return true
  21. }
  22. }
  23. }
  24. }
  25. return false
  26. }
  27. func maxInt(x, y int) int {
  28. if x < y {
  29. return y
  30. }
  31. return x
  32. }