描述
给定一个整数矩阵(其中,有 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。
网友评论