leetcode 刷題之深度優先搜尋

2021-10-13 22:51:09 字數 1871 閱讀 6861

對於一般的dfs問題,其相鄰的邊代表了不同的搜尋方向,有向圖一般不會陷入重複搜尋的死迴圈,因此不需要標記已訪問節點的seen矩陣,比如二叉樹問題,797. 所有可能的路徑;而無向圖則需要定義的乙個標記已訪問節點的seen矩陣。

dfs 一般可以用來確定連通域(島嶼等), bfs可以用來查詢最短路徑長度等。 

934. 最短的橋

dfs + bfs 。 dfs找到其中的乙個島嶼,然後利用bfs逐步往外擴充套件,直到碰到第二個島嶼。這裡需要注意的是

dfs+剪枝

851. 喧鬧和富有

886. 可能的二分法

785. 判斷二分圖

有兩種顏色,紅色和藍色。不喜歡的兩個元素應該圖不同的顏色。 紅色為1, 藍色為-1。初始時節點顏色都標記為0, 非零則表示已經對該節點已經相鄰的節點完成染色。

802. 找到最終的安全狀態

這是乙個環檢測問題。利用染色的思想判斷從某個節點的任意鄰居出發是否有環。只有當所有的鄰居都不能進入環時,其才可能達到安全狀態。0為初始狀態,1為安全狀態,-1為不安全狀態。

從乙個節點出發如果能達到自己或者其他不安全的節點,則該節點也是不安全,因此對每個節點而言, 我們先將其標記為不安全狀態,待確保其所有相鄰幾點都是安全節點時再將其標記為安全狀態。

單源最短路徑

743. 網路延遲時間

547. 省份數量

乙個城市從直接相鄰的城市出發用 dfs 查詢間接相鄰的城市。每個城市只能屬於乙個省份。

721. 賬戶合併

屬於同乙個使用者名稱的郵箱有一條邊相連, 因此賬戶合併問題將轉化成連通域問題。

797. 所有可能的路徑

491. 遞增子串行

自頂向下和自底向上均可,但是無論哪種方式,set 都可以輔助進行去重功能。

自底向上:先得到子串行的遞增序列,然後處理加入當前元素之後的新的遞增序列。

自頂向下:我們可以用乙個vector表示待加入結果中的候選序列,從前往後處理,那麼對於乙個新元素,如果滿足遞增條件,那麼它有兩種選擇,要麼加入遞增序列,要麼不加入。

494. 目標和

自頂向下,對每個元素有兩種選擇,要麼加要麼減。 但是這種方法時間複雜度比較高。這其實是典型的揹包為題。可以借助動態規劃解決。

526. 優美的排列

先找出每個位置能夠放置數字集合,然後從前往後用 dfs 逐個位置放置不同的數字求求解滿足的乙個排列,注意同乙個排列中,乙個數字只能出現依次。

17. **號碼的字母組合

先求字串的字母組合,再列舉新增當前字元之後的結果。

109. 有序鍊錶轉換二叉搜尋樹

利用快慢指標確定根節點的位置,然後分別遞迴處理左右子樹。

207. 課程表

依賴關係形成圖,有環則代表迴圈依賴,無法完成課程。利用鄰接表逐個節點自頂向下判斷是否有環。

473. 火柴拼正方形

正方形的四條邊相當於四個小盒子,對每根火逐個試探放入其中乙個盒子,當把所有火柴都放置完成之後,判斷四個盒子的火柴子和是否相等。需要剪枝降低時間複雜度。最大時間複雜度為o(4^n),因為每根火柴有4種放置方法。

小故事:這道題曾花了我乙個晚上的時間,一直超時, 開始我給出的方案是從第一根火柴開始搜尋能跟該火柴組成邊長的其他火柴。從前往後依次累加,當遇到邊長的整數倍,就代表找到了一條邊的拼法。這樣的時間複雜度就變成了o(n*n-1*n-2*....*1) 即o(n的階乘),現在想想顯然是時間複雜度過高,應該及時停止這種演算法的考慮。

130. 被圍繞的區域

1) 首先dfs替換邊界『o』以及從此處出發可達的所有『o』 為乙個特殊符號。然後遍歷陣列逐個替換其他'o'為『x』, 最後將特殊符號替換為『o』. 

2) dfs尋找包圍域的做法會超時。

417. 太平洋大西洋水流問題

從上邊界和左邊界的點出發,找出所有能到達太平洋的位置,從另外兩個邊界找出所有能到達大西洋的位置。

Leetcode刷題之深度優先

難度簡單623收藏分享切換為英文接收動態反饋 將乙個按照公升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定有序陣列 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表...

Leetcode刷題之括號

給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示例 5 輸入 輸...

leetcode刷題之堆

今天終於開啟的第二個專題的刷題之旅堆,不過第乙個專題棧還有乙個小問題沒解決就是利用遞減棧去解決接雨水的問題,雖然那道題我用動態規劃的問題解決出來了,我記得看到過一道面試題,問棧和堆有什麼區別。通過搜尋網上的資料總結如下。棧 stack 由系統分配記憶體,速度較快,但是自己無法掌握。堆 一般用兩種方法...