/**
* @param {number[][]} matrix
* @return {number}
*/
var longestIncreasingPath = function(matrix) {
if (!matrix || matrix.length === 0) {
return 0
}
var direct = [[0, -1], [0, 1], [-1, 0], [1, 0]] // 方向数组
var max = 1 // 全局最大值
var dp = new Array() // dp二维数组,保存每个点作为起点的最大路径长度
var width = matrix[0].length
var deep = matrix.length
while (deep) {
dp.push(new Array(width).fill(0)) // 每个点初始长度为0,dfs遍历到不为0的情况直接返回她的值(因为是之前已经得到了)
deep--
}
deep = matrix.length
var dfs = function (i, j) {
if (dp[i][j] > 0) return dp[i][j];
var mx = 1
for (var k = 0; k < direct.length; k++) {
var x = i + direct[k][0]
var y = j + direct[k][1]
if (x < 0 || x >= deep || y < 0 || y >=width) { // 超过范围跳过
continue
}
if (matrix[x][y] <= matrix[i][j]) {// 不是递增跳过
continue
}
var len = dfs(x, y) + 1
mx = Math.max(mx, len)
}
dp[i][j] = mx
return mx
}
for (var i = 0; i < deep; i++) {
for (var j = 0; j < width; j++) {
max = Math.max(max, dfs(i, j))
}
}
return max
};
前言
题目描述
解题思路
上面可能说的有点乱,大概就是dfs遍历和dp数组结合,难度其实并不算大,但是可以优化的细节还是挺多的,下面代码附有具体注释
具体代码