Given an
From each cell, you can either move in four directions: left, right, up, or down. You may not move diagonally or move outside the boundary (i.e., wrap-around is not allowed).
Example 1:

Input: matrix = [[9,9,4],[6,6,8],[2,1,1]] Output: 4 Explanation: The longest increasing path is[1, 2, 6, 9] .
Example 2:

Input: matrix = [[3,4,5],[3,2,6],[2,2,1]] Output: 4 Explanation: The longest increasing path is[3, 4, 5, 6] . Moving diagonally is not allowed.
Example 3:
Input: matrix = [[1]] Output: 1
Constraints:
m == matrix.length n == matrix[i].length 1 <= m, n <= 200 0 <= matrix[i][j] <= 231 - 1
Solution
這題直覺想到用 DFS 來做,但是會TLE,所以要加速一下
這次要使用一個 DP 來加速,dp[i][j] 表示從 matrix[i][j] 出發的最大長度
所以在 DFS 的過程當中,如果 dp[i][j] 值已經不是初始的 0,那就直接回傳該值就好
kotlin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
fun longestIncreasingPath(matrix: Array<IntArray>): Int { | |
val dp = Array(matrix.size) {IntArray(matrix[0].size) {0} } | |
var ans = 1 | |
for(r in matrix.indices) { | |
for(c in matrix[0].indices) { | |
ans = Math.max(ans, dfs(r,c,matrix,dp)) | |
} | |
} | |
return ans | |
} | |
fun dfs(row:Int, col:Int, matrix: Array<IntArray>, dp: Array<IntArray>): Int { | |
if(dp[row][col] > 0) { | |
return dp[row][col] | |
} | |
var maxLength = 1 | |
for(r in -1..1 step 2) { | |
val newRow = row+r | |
if(newRow < 0 | |
|| newRow > matrix.lastIndex | |
|| matrix[newRow][col] <= matrix[row][col] | |
) { | |
continue | |
} | |
maxLength = Math.max(maxLength, dfs(newRow,col,matrix,dp)+1) | |
} | |
for(c in -1..1 step 2) { | |
val newCol = col+c | |
if(newCol < 0 | |
|| newCol > matrix[0].lastIndex | |
|| matrix[row][newCol] <= matrix[row][col] | |
) { | |
continue | |
} | |
maxLength = Math.max(maxLength, dfs(row,newCol,matrix,dp)+1) | |
} | |
dp[row][col] = maxLength | |
return maxLength | |
} | |
} |
沒有留言:
張貼留言