LeetCode 329. Longest Increasing Path in a Matrix

简介: 给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

v2-76529bbdd9bd60dedf3b754ea7b19135_1440w.jpg

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]


源代码文件在 这里


目录
相关文章
Leetcode 74. Search a 2D Matrix
这道题很简单,为此专门写篇博客其实算博客凑数了。给你一个每一行每一列都是增序,且每一行第一个数都大于上一行末尾数的矩阵,让你判断某个数在这个矩阵中是否存在。 假设矩阵是m*n,扫一遍的时间复杂度就是O(m*n),题目中给出的这么特殊的矩阵,时间复杂度可以降到O(m+n),具体代码如下,写的比较挫。
86 1
Leetcode 516. Longest Palindromic Subsequence
找到一个字符串的最长回文子序列,这里注意回文子串和回文序列的区别。子序列不要求连续,子串(substring)是要求连续的。leetcode 5. Longest Palindromic Substring就是求连续子串的。
49 0
Leetcode 240. Search a 2D Matrix II
具体思路就是每一行倒着扫,扫到第一个比target小的数就跳到下行,如果等于当然是直接返回true了,如果下一行还比target小就继续跳下一行,直到最后一行。 为啥这么做是可行的? 可能我比较笨,想了半天才想到。 因为每一列都是增序的,举个例子,假设matrix[0][5] > target,那么[0][5]位置右下(包含右和下)所有元素不可能比target小。
47 0
|
Java
Leetcode 3. Longest Substring Without Repeating Characters
此题题意是找出一个不包含相同字母的最长子串,题目给出了两个例子来说明题意,但这两个例子具有误导性,让你误以为字符串中只有小写字母。还好我是心机boy,我把大写字母的情况也给考虑进去了,不过。。。。字符串里竟然有特殊字符,于是贡献了一次wrong answer,这次我把ascii字符表都考虑进去,然后就没问题了。这个故事告诫我们在编程处理问题的时候一定要注意输入数据的范围,面试中可以和面试官去确认数据范围,也能显得你比较严谨。
53 3
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode 424. Longest Repeating Character Replacem
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
105 0
LeetCode 424. Longest Repeating Character Replacem
LeetCode 409. Longest Palindrome
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
74 0
LeetCode 409. Longest Palindrome
LeetCode 395. Longest Substring with At Least K
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
92 0
LeetCode 395. Longest Substring with At Least K
|
Windows
LeetCode 388. Longest Absolute File Path
我们致力于寻找我们文件系统中文件的最长 (按字符的数量统计) 绝对路径。例如,在上述的第二个例子中,最长路径为 "dir/subdir2/subsubdir2/file2.ext",其长度为 32 (不包含双引号)。
84 0
LeetCode 388. Longest Absolute File Path
|
Python
LeetCode 378. Kth S Element in a Sorted Matrix
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。 请注意,它是排序后的第k小元素,而不是第k个元素。
108 0
LeetCode 378. Kth S Element in a Sorted Matrix