原題
給定一個整數矩陣,找出最長遞增路徑的長度。
對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。
示例 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]。注意不允許在對角線方向上移動。
思路
我的思路是先將所有元素按照從小到大排序。從矩陣的最小值出發,其最長路徑值爲1,然後計算第二小的數的最長路徑值,以此類推進行計算,規則如下:
-
周邊的數字如果都大於當前數字,那個當前數字只能走一步,記角標1。
-
如果周邊的數字存在小於當前數字的,因爲是從小到大開始計算的,那個較小的數字之前已經計算過了。因此該方向的步數爲1+角標數字。當前數字的最終角標爲這四個方向中的最大的。
當然, 其實也可以按照從大到小排序。
思路圖
最後,還要避免空集。
具體實現代碼(python)
# -*- coding: utf8 -*-
import re
def longth(matrix):
a = len(matrix)
dics = {}
nums_max = 1
if a != 0:
b = len(matrix[0])
for i in range(a):
for j in range(b):
dics[(i,j)] = matrix[i][j]
dic_key = dics.keys()
values = [[1 for i in range(b)] for j in range(a)]
dics = sorted(dics.items(), key = lambda x: x[1])
for dic in dics:
i = dic[0][0]
j = dic[0][1]
if (i+1,j) in dic_key and matrix[i+1][j]<matrix[i][j] and values[i][j]<values[i+1][j]+1:
values[i][j] = values[i+1][j] + 1
if (i,j+1) in dic_key and matrix[i][j+1]<matrix[i][j] and values[i][j]<values[i][j+1]+1:
values[i][j] = values[i][j+1] +1
if (i-1,j) in dic_key and matrix[i-1][j]<matrix[i][j] and values[i][j]<values[i-1][j]+1:
values[i][j] = values[i-1][j] +1
if (i,j-1) in dic_key and matrix[i][j-1]<matrix[i][j] and values[i][j]<values[i][j-1]+1:
values[i][j] = values[i][j-1] + 1
nums_max = max(nums_max,values[i][j])
else:
nums_max = 0
return nums_max
matrix_rows = 0
matrix_cols = 0
matrix_rows = int(input())
matrix_cols = int(input())
matrix = []
for matrix_i in range(matrix_rows):
matrix_temp = map(int, re.split(r'\s+', input().strip()))
matrix.append(list(matrix_temp))
#matrix = [[9,9,4],[6,6,8],[2,1,1]]
#print matrix
res = longth(matrix)
print(str(res) + "\n")