题解 | #矩阵最长递增路径#

矩阵最长递增路径

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
}

全部评论

相关推荐

威猛的小饼干正在背八股:挂到根本不想整理
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务