329.longest-increasing-path-in-a-matrix.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. type pair struct {
  2. _1 int
  3. _2 int
  4. }
  5. func longestIncreasingPath(matrix [][]int) (max int) {
  6. m := len(matrix)
  7. if m == 0 {
  8. return 0
  9. }
  10. n := len(matrix[0])
  11. if n == 0 {
  12. return 0
  13. }
  14. mem := make(map[pair]int)
  15. for i := 0; i < m; i++ {
  16. for j := 0; j < n; j++ {
  17. max = maxInt(max, dfs(matrix, m, n, j-1, i, matrix[i][j], &mem))
  18. max = maxInt(max, dfs(matrix, m, n, j+1, i, matrix[i][j], &mem))
  19. max = maxInt(max, dfs(matrix, m, n, j, i-1, matrix[i][j], &mem))
  20. max = maxInt(max, dfs(matrix, m, n, j, i+1, matrix[i][j], &mem))
  21. }
  22. }
  23. max++
  24. return
  25. }
  26. func dfs(matrix [][]int, m, n, x, y, val int, mem *map[pair]int) (max int) {
  27. if x < 0 || y < 0 || m <= y || n <= x || matrix[y][x] <= val {
  28. return 0
  29. }
  30. if l, ok := (*mem)[pair{x, y}]; ok {
  31. return l
  32. }
  33. max = maxInt(max, dfs(matrix, m, n, x-1, y, matrix[y][x], mem))
  34. max = maxInt(max, dfs(matrix, m, n, x+1, y, matrix[y][x], mem))
  35. max = maxInt(max, dfs(matrix, m, n, x, y-1, matrix[y][x], mem))
  36. max = maxInt(max, dfs(matrix, m, n, x, y+1, matrix[y][x], mem))
  37. max++
  38. (*mem)[pair{x, y}] = max
  39. return
  40. }
  41. func maxInt(x, y int) int {
  42. if x < y {
  43. return y
  44. }
  45. return x
  46. }