難度:困難
給定乙個整數矩陣,找出最長遞增路徑的長度。
對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。
示例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...