2021年10月29日 星期五

[LeetCode] 329. Longest Increasing Path in a Matrix

轉自LeetCode

Given an m x n integers matrix, return the length of the longest increasing path in matrix.

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

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
}
}

沒有留言:

張貼留言