加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

[Swift]LeetCode329. 矩阵中的最长递增路径 | Longest Increasin

发布时间:2020-12-14 05:06:14 所属栏目:百科 来源:网络整理
导读:Given an integer matrix,find the length of the longest increasing path. From each cell,you can either move to four directions: left,right,up or down. You may NOT move diagonally or move outside of the boundary (i.e. wrap-around is not allo

Given an integer matrix,find the length of the longest increasing path.

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

Example 1:

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

Example 2:

Input: nums = 
[
  [3,4,5],[3,6],[2,1]
] 
Output: 4 
Explanation: The longest increasing path is . Moving diagonally is not allowed.[3,4,5,6]

给定一个整数矩阵,找出最长递增路径的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

示例 1:

输入: nums = 
[
  [9,[6,1,1]
] 
输出: 4 
解释: 最长递增路径为?。[1,9]

示例 2:

输入: nums = 
[
  [3,5],6],1]
] 
输出: 4 
解释: 最长递增路径是?。注意不允许在对角线方向上移动。[3,6]

?284 ms
 1 class Solution {
 2    func longestIncreasingPath(_ matrix: [[Int]]) -> Int {
 3         
 4         if matrix.isEmpty || matrix[0].isEmpty {
 5             return 0
 6         }
 7         
 8         let m = matrix.count
 9         let n = matrix[0].count
10         
11         var counts = Array(repeating: Array(repeating: 0,count: n),count: m)
12         var longest = 0
13         
14         for i in 0..<m {
15             for j in 0..<n {
16                 let c = longestHelp(matrix,&counts,i,j)
17                 longest = max(longest,c)
18             }
19         }
20         
21         return longest
22     }
23     
24     func longestHelp(_ matrix: [[Int]],_ counts : inout [[Int]],_ x : Int,_ y : Int) ->Int  {
25         if counts[x][y] != 0 {
26             return counts[x][y]
27         }
28         
29         var res = 1
30         if x > 0 && matrix[x-1][y] > matrix[x][y] {
31             res = max(res,longestHelp(matrix,&counts,x-1,y) + 1)
32         }
33         if x < matrix.count-1 && matrix[x+1][y] > matrix[x][y] {
34             res = max(res,x+1,y) + 1)
35         }
36         
37         if y > 0 && matrix[x][y-1] > matrix[x][y] {
38             res = max(res,x,y-1) + 1)
39         }
40         if y < matrix[0].count-1 && matrix[x][y+1] > matrix[x][y] {
41             res = max(res,y+1) + 1)
42         }
43         
44         counts[x][y] = res
45         return res
46     }
47 }

404ms

 1 class Solution {
 2     var dp: [[Int]] = []
 3     let dirs: [[Int]] = [[-1,0],[0,-1],[1,1]]
 4     func longestIncreasingPath(_ matrix: [[Int]]) -> Int {
 5         if matrix.count == 0 { return 0 }
 6         dp = [[Int]](repeating: [Int](repeating: -1,count: matrix[0].count),count: matrix.count)
 7         var res = 0
 8         for r in 0..<matrix.count {
 9             for c in 0..<matrix[0].count {
10                 res = max(res,dfs(matrix,r,c))
11             }
12         }
13         
14         return res
15     }
16     
17     private func dfs(_ matrix: [[Int]],_ r: Int,_ c: Int) -> Int {
18         if self.dp[r][c] != -1 {
19             return dp[r][c]
20         }
21         
22         var res = 0
23         for dir in dirs {
24             let newr  = r+dir[0],newc =  c + dir[1]
25             if newr >= 0 && newc >= 0 &&
26                 newr < matrix.count && newc < matrix[0].count &&
27                 matrix[newr][newc] > matrix[r][c] {
28                     res = max(res,newr,newc))
29                 }
30             
31         }
32         dp[r][c] = res+1
33         return res + 1
34     }
35 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读