美文网首页
LintCode-最长上升连续子序列 II

LintCode-最长上升连续子序列 II

作者: 想当厨子的程序员 | 来源:发表于2018-09-22 10:42 被阅读0次

    描述

    给定一个整数矩阵(其中,有 n 行, m 列),请找出矩阵中的最长上升连续子序列。(最长上升连续子序列可从任意行或任意列开始,向上/下/左/右任意方向移动)。

    样例

    给定一个矩阵

    [
    [1 ,2 ,3 ,4 ,5],
    [16,17,24,23,6],
    [15,18,25,22,7],
    [14,19,20,21,8],
    [13,12,11,10,9]
    ]
    返回 25

    挑战

    O(nm) 时间复杂度及存储

    代码

    class Solution:
        """
        @param matrix: A 2D-array of integers
        @return: an integer
        """
    
        def longestContinuousIncreasingSubsequence2(self, matrix):
            # write your code here
            if len(matrix) == 0:
                return 0
            self.matrix = matrix
            self.maxIndex_n = len(matrix) - 1
            self.maxIndex_m = len(matrix[0]) - 1
            result = 0
            self.dp = [[0 for j in range(len(matrix[0]))] for i in range(len(matrix))]
            for i in range(len(matrix)):
                for j in range(len(matrix[0])):
                    self.dp[i][j] = self.Dfs(i, j)
                    result = max(result, self.dp[i][j])
            return result
    
        def Dfs(self, i, j):
            if self.dp[i][j] != 0:
                return self.dp[i][j]
            result = 0
            if self.matrix[max(i - 1, 0)][j] > self.matrix[i][j]:
                result = max(result, self.Dfs(max(i - 1, 0), j))
            if self.matrix[min(i + 1, self.maxIndex_n)][j] > self.matrix[i][j]:
                result = max(result, self.Dfs(min(i + 1, self.maxIndex_n), j))
            if self.matrix[i][min(j + 1, self.maxIndex_m)] > self.matrix[i][j]:
                result = max(result, self.Dfs(i, min(j + 1, self.maxIndex_m)))
            if self.matrix[i][max(j-1, 0)] > self.matrix[i][j]:
                result = max(result, self.Dfs(i, max(j-1, 0)))
            self.dp[i][j] = result+1
            return result + 1
    

    动态规划加DFS,DFS来搜索某个点(i,j)的局部最长连续子序列,并通过动态规划思想的dp数组记录,这样,例如在搜索1的局部最长连续子序列长度时,一定会经过21,22,23,24等数,那么“顺便就可以将”他们的局部最长连续子序列长度填入dp数组中,在之后遍历或是其他的点搜索到到它们这些点时,就不需要进行更深层次的递归,直接返回这个值即可。
    总而言之,还是动态规划的思路,不过对与数据的遍历由单纯的循环拓展为了循环加DFS。

    相关文章

      网友评论

          本文标题:LintCode-最长上升连续子序列 II

          本文链接:https://www.haomeiwen.com/subject/ljwtoftx.html