题解 | #矩阵最长递增路径#
矩阵最长递增路径
https://www.nowcoder.com/practice/7a71a88cdf294ce6bdf54c899be967a2
package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 递增路径的最大长度
* @param matrix int整型二维数组 描述矩阵的每个数
* @return int整型
*/
//方法1:暴力法。m*n个元素 -> m*n个元素;判断每条路径是否递增; -》递增的情况下是否是最长(长度是多少)
//方法2:采用dfs的方法回溯;从每个元素出发;可以抵达的最长路径是啥?长度是?
//方法3:在方法2的层面上进行优化;剔除调那些已经访问过的;不再访问的->动态规划记录当前位置的最优解;然后和当前位置的进行组合
// dfs发现最长的路径
/*
func dfsFindLongestLength(i, j, m, n int, matrix [][]int) int {
//当前位置;上下左右左移动
//如果上下左右没有满足的可以移动的位置,返回(出界;没有更大的元素)
//符合条件才移动
var (
maxLength int
)
if i-1 >= 0 && matrix[i][j] < matrix[i-1][j] {
maxLength = dfsFindLongestLength(i-1, j, m, n, matrix)
}
if i+1 < m && matrix[i][j] < matrix[i+1][j] {
tmp := dfsFindLongestLength(i+1, j, m, n, matrix)
if tmp > maxLength {
maxLength = tmp
}
}
if j-1 >= 0 && matrix[i][j] < matrix[i][j-1] {
tmp := dfsFindLongestLength(i, j-1, m, n, matrix)
if tmp > maxLength {
maxLength = tmp
}
}
if j+1 < n && matrix[i][j] < matrix[i][j+1] {
tmp := dfsFindLongestLength(i, j+1, m, n, matrix)
if tmp > maxLength {
maxLength = tmp
}
}
return maxLength + 1
}
func solve(matrix [][]int) int {
// write code here
//从各个位置出发;最长分别的最长路径是?
res := 0
for i := 0; i < len(matrix); i++ {
for j := 0; j < len(matrix[0]); j++ {
tmp := dfsFindLongestLength(i, j, len(matrix), len(matrix[0]), matrix)
if tmp > res {
res = tmp
}
}
}
return res
}
*/
//采用动态规划优化之后的解
// dfs发现最长的路径
func dfsFindLongestLength(i, j, m, n int, matrix, curPosLongest [][]int) int {
//当前位置;上下左右左移动c
//如果上下左右没有满足的可以移动的位置,返回(出界;没有更大的元素)
//符合条件才移动
var (
maxLength int
tmp int
)
if i-1 >= 0 && matrix[i][j] < matrix[i-1][j] {
if curPosLongest[i-1][j] != 0 {
maxLength = curPosLongest[i-1][j]
} else {
maxLength = dfsFindLongestLength(i-1, j, m, n, matrix, curPosLongest)
}
}
if i+1 < m && matrix[i][j] < matrix[i+1][j] {
if curPosLongest[i+1][j] != 0 {
tmp = curPosLongest[i+1][j]
} else {
tmp = dfsFindLongestLength(i+1, j, m, n, matrix, curPosLongest)
}
if tmp > maxLength {
maxLength = tmp
}
}
if j-1 >= 0 && matrix[i][j] < matrix[i][j-1] {
if curPosLongest[i][j-1] != 0 {
tmp = curPosLongest[i][j-1]
} else {
tmp = dfsFindLongestLength(i, j-1, m, n, matrix, curPosLongest)
}
if tmp > maxLength {
maxLength = tmp
}
}
if j+1 < n && matrix[i][j] < matrix[i][j+1] {
if curPosLongest[i][j+1] != 0 {
tmp = curPosLongest[i][j+1]
} else {
tmp = dfsFindLongestLength(i, j+1, m, n, matrix, curPosLongest)
}
if tmp > maxLength {
maxLength = tmp
}
}
curPosLongest[i][j] = maxLength + 1
return curPosLongest[i][j]
}
func solve(matrix [][]int) int {
// write code here
//从各个位置出发;最长分别的最长路径是?
curPosLongest := make([][]int, len(matrix))
for i := 0; i < len(matrix); i++ {
tmp := make([]int, len(matrix[0]))
curPosLongest[i] = tmp
}
res := 0
for i := 0; i < len(matrix); i++ {
for j := 0; j < len(matrix[0]); j++ {
tmp := dfsFindLongestLength(i, j, len(matrix), len(matrix[0]), matrix, curPosLongest)
if tmp > res {
res = tmp
}
}
}
return res
}