給定乙個整數矩陣,找出最長遞增路徑的長度。
對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。
示例 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]。注意不允許在對角線方向上移動。
思路:
我們建立矩陣mem[row][col]記錄每個位置的最長遞增路徑長度。
對於矩陣每個元素nums[ i ][ j ] ,使用函式 f
ff 計算其mem[ i ][ j ],記錄最大的mem[ i ][ j ]到res中。
返回res。
狀態轉移函式 f
ff 的計算方法。
f (m
at,i
,j)f(mat, i, j)
f(mat,
i,j)
其中mat為元素矩陣nums,必須採用引用,不然當nums很大時,迭代十分耗時,通過不了題目。
f (m
at,i
,j)f(mat, i, j)
f(mat,
i,j)
內, 若mem[ i ][ j ]已經訪問,則直接返回。
否則,初始化ret=1,即當前元素的初始最長路徑長度。計算其四周元素(上,下,左,右),若近鄰元素大於當前元素,則說明當前元素可以插入到近鄰元素的前面,形成更長的路徑。
假設近鄰元素為 mat[ i-1 ][ j ],此時:
mem[ i ][ j ]= max( ret, 1+f(m
at,i
−1,j
)f(mat, i-1, j)
f(mat,
i−1,
j))。max()函式需要包含標頭檔案 #include< algorithm> 。計算完上下左右之後,則mem[ i ][ j ] = ret。
將ret 作為f(m
at,i
,j)f(mat, i, j)
f(mat,
i,j)
的返回值。
**:
class
solution
//主函式
intlongestincreasingpath
(vector
int>>
& matrix)
}return res;}}
;
簡化**:
class
solution,,
,};//上下左右
intdfs
(vector
int>>
& matrix,
int i,
int j)
return dp[i]
[j];
}int
longestincreasingpath
(vector
int>>
& matrix)
}return longest;}}
;
結果:
[1] 暮雨涼初透:【leetcode】329. 矩陣中的最長遞增路徑 結題報告 (c++)
LeetCode C 實現最長回文子串
在leetcode上做的題,剛開始因為對題目的一點小誤解,所以花了不少時間,最終以16ms的成績通過了。給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 演算法 ...
矩陣中的最長遞增路徑
矩陣中的最長遞增路徑 給定乙個整數矩陣,找出最長遞增路徑的長度。對於每個單元格,你可以往上,下,左,右四個方向移動。你不能在對角線方向上移動或移動到邊界外 即不允許環繞 題解 首先看到這道題,突然想到島嶼那題,每次向著四個方向不斷遞迴 只是條件是只遞迴比當前數大的數,所以使用深度搜尋,並且返回搜尋中...
LeetCode C 搜尋二維矩陣 II
編寫乙個高效的演算法來搜尋 m x n 矩陣 matrix 中的乙個目標值 target。該矩陣具有以下特性 示例 現有矩陣 matrix 如下 quad 1,4,7,11,15 quad 2,5,8,12,19 quad 3,6,9,16,22 quad 10,13,14,17,24 quad 1...