LeetCode C 矩陣中的最長遞增路徑

2021-10-08 04:54:47 字數 1959 閱讀 6914

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

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

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