這道題目是困難級別的,原題目位址leetcode,我剛開始沒想出頭緒,看了題解,才想到用深度優先搜尋,僅此而已
給定乙個整數矩陣,找出最長遞增路徑的長度。
對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。
示例 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來說明,
[[9
,9,4
],[6
,6,8
],[2
,1,1
]] 用這麼乙個二維陣列來記錄結果。咱們先人腦遍歷。[[
0,0,
0],[
0,0,
0],[
0,0,
0]] 最小的數字是1,那麼這兩個位置,最長路徑就是1,即本身。
[0,0
,0],
[0,0
,0],
[0,0
,1]向外擴散一步
[0,0
,0],
[0,0
,0],
[0,1
,1]
向外擴散一步
[0,0
,0],
[0,2
,0],
[2,1
,1]
兩個2都向外擴散一步
[0,3
,0],
[3,2
,3],
[2,1
,1]
最後得到結果
[4,3
,1],
[3,2
,3],
[2,1
,1]
即,求某乙個單元格的最大路徑,先假設它周圍四格的最大路徑已經算出來了(人腦不擅長遞迴),如果中間這個單元格的數字,大於相鄰的單元格,那最大路徑就是相鄰單元格最大路徑+1,這樣最多可求得四個值,取四個值中最大的那個。
如果文字不太好理解,直接看**。
class solution
int res =0;
row = matrix.length;
col = matrix[0]
.length;
int[
] mem = new int
[row]
[col]
;for
(int i =
0; i < row; i++)}
return res;
} public int row, col;
public int
x = new int
;// 上下左右四個方向
public int
y = new int
; private int
dfs(
int[
] mem,
int[
] matrix,
int i,
int j)
mem[i]
[j]==1;
// 初始值設定為1
for(
int k =
0; k <
4; k++)}
return mem[i]
[j];
// 返回此單元格的最大路徑
}}
深度優先搜尋解決全排列問題
題目 假如有編號為1 2 3的3張撲克牌和編號為1 2 3的3個盒子。現在需要將這3張撲克牌分別放到3個盒子裡,並且每個盒子有且只能放一張撲克牌。那麼一共有多少種不同的排法?及注釋 include 全域性變數,陣列元素值自動初始化為0 int a 10 充當盒子編號 int book 10 用boo...
深度優先搜尋解決八皇后問題
八皇后問題是什麼 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌...
深度優先搜尋 廣度優先搜尋(解決小哈)
問題省略 思路 讓小哼往右邊走,直到走不通的時候再回到這裡,再去嘗試另乙個方向。規定乙個順序,按順時針方向來嘗試 即按照右 下 左 上的順序去嘗試 先 檢查小哼是否已經到達小哈的位置,如果沒有到達則找出下一步可以走的地方。為了解決這個問題,此處dfs 函式只需要維護3個引數,分別是x座標 y座標 以...