這是leetcode 上的乙個經典的習題: 也是我面試伴魚時碰到的乙個問題(汗~ 當初沒好好刷題)
給你乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,請你計算網格中島嶼的數量。
島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連線形成。
此外,你可以假設該網格的四條邊均被水包圍。
其實這是乙個 典型的遞迴回溯演算法。 為什麼這麼說呢?
我們的目的就是遍歷一下所有連著的島嶼,並將其染色
每次遞迴回來時: 就說明一塊連續的島嶼走完了。
但是: 題目給的二維陣列:也就是說:存在若干島嶼
那麼 就需要遍歷了。 那麼怎麼保證遞迴的時間複雜度呢?
我們可以開闢二維陣列來進行標記。
走過的島嶼用true 標記
其實這同時是乙個典型的dfs演算法解題套路
class
solution,,
,};int m,n;
//島嶼 長、寬
private
:bool
inarea
(int a,
int b)
void
subquestion
(vectorchar
>>
& grid,
int x,
int y)}}
public
:int
numislands
(vectorchar
>>
& grid)
};
我當時面試的題目:是求最大的一塊島嶼面積:其實整體思路是一樣的,稍微一丟丟差距就是求最大的一塊島嶼的面積。
那麼怎麼做?
簡單: 在遞迴時同時傳入乙個引數,記錄當前島嶼的面積, 每次遞迴返回後,判斷要不要更新最大島嶼面積,即可 。
給定乙個包含了一些 0 和 1 的非空二維陣列 grid 。
乙個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裡的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0(代表水)包圍著。
找到給定的二維陣列中最大的島嶼面積。(如果沒有島嶼,則返回面積為 0 。)
class
solution,,
,};int m,n;
//島嶼 長、寬
private
:bool
inarea
(int a,
int b)
void
subquestion
(vectorint>>
& grid,
int x,
int y,
int& area)}}
public
:int
maxareaofisland
(vectorint>>
& grid)
return res;}}
;
這個就先對而言簡單多了 ,我就不實現了。
注意的是 儲存記錄資料:
列 , 兩條對角線
在注意的是 兩條對角線有什麼規律。
左上角為 0,0 右下角為 n,n
class
solution
}public
:// 分析返回值型別便知道了,每一組乙個vector,也就是用string替換了乙個vector
vector>
solvenqueens
(int n)
};
演算法整理 回溯
一.八皇后問題 第一種解法將棋盤的所有格仔都初始化為 定義遞迴函式為前l 1行的格仔已經排好 給定排面的情況下 從第l層開始繼續排得到的八皇后搜尋結果。具體做法是從第l行的每乙個列逐列嘗試,如果不衝突則加入,再進行l 1的問題求解,求解完後進行回溯。空間複雜度為o n n classsolution...
演算法 遞迴與回溯演算法解決八皇后問題
小結完整 在沒有其他演算法的加持下時,回溯演算法簡單來說,就是不斷試錯的過程。通過不斷向下乙個節點列舉尋找滿足條件的答案,當無法尋找到時,則返回至上乙個節點,然後繼續向下列舉。這句話可能看起來有點抽象,我們用乙個圖來演示一下。這是一張a村到e村的地圖。假設你從起點a出發到終點e 不是e1 在不知道路...
回溯演算法的模板整理
回溯演算法的基本模板在很多場合有很重要的作用,一般的回溯問題都是在基本的模板上進行變種解決。回溯演算法在排列組合問題上主要分為不可重複回溯和可重複回溯,如 不可重複回溯 1 2 回溯演算法不可重複 相當於每一層選擇乙個進行排列組合3 param nums4 param temp5 6 in 1 2 ...