遞迴與回溯演算法整理(二)

2021-10-06 08:35:55 字數 1862 閱讀 7663

這是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 ...