摘要:思路这道题主要使用记忆化递归和深度优先遍历。我们以给定的矩阵的每一个位置为起点,进行深度优先遍历。我们存储每个位置深度优先遍历的结果,当下一次走到这个位置的时候,我们直接返回当前位置记录的值,这样可以减少遍历的次数,加快执行速度。
Description
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, 6, 9].
Example 2:
Input: nums = [ [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.描述
给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
示例 1:
输入: nums = [ [9,9,4], [6,6,8], [2,1,1] ] 输出: 4 解释: 最长递增路径为 [1, 2, 6, 9]。
示例 2:
输入: nums = [ [3,4,5], [3,2,6], [2,2,1] ] 输出: 4 解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。思路
这道题主要使用记忆化递归和深度优先遍历。
我们以给定的矩阵的每一个位置为起点,进行深度优先遍历。
我们存储每个位置深度优先遍历的结果,当下一次走到这个位置的时候,我们直接返回当前位置记录的值,这样可以减少遍历的次数,加快执行速度。
二维矩阵 dp 初始化每个位置都为 0 ,当遍历到某个位置不为 0 的时候,说明该位置已经遍历过了,我们直接返回其值。
# -*- coding: utf-8 -*- # @Author: 何睿 # @Create Date: 2019-03-07 21:19:51 # @Last Modified by: 何睿 # @Last Modified time: 2019-03-07 22:23:10 from itertools import product class Solution: def longestIncreasingPath(self, matrix: [[int]]) -> int: # 如果矩阵为空,返回 0 if not matrix or not matrix[0]: return 0 # 获取矩阵的行数和列数 row, col = len(matrix), len(matrix[0]) # 记忆化递归,记录每个位置的最大值 dp = [[0] * col for _ in range(row)] # 遍历每一个位置,以每一个位置为起点进行深度优先遍历 # 返回最大值 return max( self._dfs(i, j, row, col, matrix, dp) for i, j in product(range(row), range(col))) def _dfs(self, i, j, row, col, matrix, dp): # 如果当前位置不为零,说明当前位置的最大值已经被找到 # 采用记忆化递归,直接返回最大值 if dp[i][j]: return dp[i][j] # 遍历四个方向 for x, y in [(0, -1), (-1, 0), (0, 1), (1, 0)]: m, n = x + i, y + j # 如果下一个位置没有越界并且下一个位置的只严格大于位置i,j if 0 <= m < row and 0 <= n < col and matrix[i][j] < matrix[m][n]: # 记录最大值 dp[i][j] = max(dp[i][j], self._dfs(m, n, row, col, matrix, dp)) # 把当前位置本身加上 dp[i][j] += 1 # 返回以当前位置为起点,所有路径中的最大值 return dp[i][j]
源代码文件在 这里 。
©本文首发于 何睿的博客 ,欢迎转载,转载需保留 文章来源 ,作者信息和本声明.
微信公众号:techruicore
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43302.html
摘要:题目要求思路和代码这里采用广度优先算法加上缓存的方式来实现。我们可以看到,以一个节点作为开始构成的最长路径长度是确定的。因此我们可以充分利用之前得到的结论来减少重复遍历的次数。 题目要求 Given an integer matrix, find the length of the longest increasing path. From each cell, you can ei...
摘要:复杂度思路为了避免搜索已经搜索的点。所以考虑用一个数组,记录到每一个点能产生的最长序列的长度。考虑用进行搜索,对于每一个点来说,考虑先找到最小的那个点针对每一条路径的。然后对于每一点再递增回去,依次累积找到增加的值。 LeetCode[329] Longest Increasing Path in a Matrix Given an integer matrix, find the ...
Problem 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 ou...
Problem 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 ou...
摘要:题目解答最重要的是用保存每个扫过结点的最大路径。我开始做的时候,用全局变量记录的没有返回值,这样很容易出错,因为任何一个用到的环节都有可能改变值,所以还是在函数中定义,把当前的直接返回计算不容易出错。 题目:Given an integer matrix, find the length of the longest increasing path. From each cell, y...
阅读 3384·2021-11-25 09:43
阅读 3447·2021-11-19 09:40
阅读 2384·2021-10-14 09:48
阅读 1260·2021-09-09 11:39
阅读 1903·2019-08-30 15:54
阅读 2802·2019-08-30 15:44
阅读 1977·2019-08-29 13:12
阅读 1515·2019-08-29 12:59