leetcode每日一題 矩陣中的最長遞增路徑

2021-10-08 13:14:53 字數 1704 閱讀 2067

難度:困難

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

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

示例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]。注意不允許在對角線方向上移動。

思路:看到這個題目,第乙個想到的又是動態規劃。但是這個題目路徑的起點不確定,所以很難用一般方法去解決,另外這種關於路徑的問題我們很容易就能想到深度優先搜尋。對每個節點做深度優先搜尋,都能找出一條遞增路徑,最終得到最長的路徑長度。

動態規劃+dfs:

int dir[4]

[2]=

,,,}

;//分別代表上下左右

int rows, columns;

//全域性變數便於傳參

intlongestincreasingpath

(int

** matrix,

int matrixsize,

int* matrixcolsize)

rows = matrixsize;

columns =

*matrixcolsize;

int*

*memo =

(int**

)malloc

(sizeof

(int*)

* rows)

;//動態分配記憶體

for(

int i =

0; i < rows; i++

)//初始化

int result =0;

for(

int i =

0; i < rows; i++)}

free

(memo)

;return result;

}int

dfs(

int*

*memo,

int row,

int column,

int*

*matrix)

memo[row]

[column]++;

//把自身加上

for(

int i =

0; i <

4; i++)}

return memo[row]

[column]

;}

**應該比較清晰,這裡還有乙個要注意的點就是在memset初始化的時候,最後乙個引數是物件所佔位元組的大小。由於我們這裡是用二級指標表示二維陣列,不能直接用sizeof(memo[i])來初始化(這樣只初始化了乙個指標大小的空間,也就是8位元組),而是需要明確表示出所有的位元組空間。如果未完全初始化由於後續有取max的操作,會對結果產生影響。

leetcode每日一題 54 螺旋矩陣

題目 給你乙個 m 行 n 列的矩陣 matrix 請按照 順時針螺旋順序 返回矩陣中的所有元素。解答 class solution def spiralorder self,matrix list list int list int m len matrix n len matrix 0 i,j ...

每日一題 LeetCode

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...

leetcode每日一題 59 螺旋矩陣II

題目 給你乙個正整數 n 生成乙個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix 思路 把res換成 0 n n,會得到錯誤的結果 解答 class solution def generatematrix self,n int list list i...