LeetCode-329:矩陣中的最長遞增路徑(動態規劃)

原題

給定一個整數矩陣,找出最長遞增路徑的長度。

對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。

示例 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。

  2. 如果周邊的數字存在小於當前數字的,因爲是從小到大開始計算的,那個較小的數字之前已經計算過了。因此該方向的步數爲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")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章