原创 拓撲排序的BFS做法

無論是 directed 還是 undirected Graph,其 BFS 的核心都在於 "indegree",處理順序也是從 indegree 最小的開始。 算法如下: 1) 先用一個 HashMap 統計下所有節點的 indeg

原创 無向圖如何檢測Cycle?

無向圖的DFS做法判斷環是否存在只用在有向圖的基礎上加個prev即可。因爲無相圖的A-B如果沒有prev可能被誤判斷爲有環。只有當next!=prev的時候我才遍歷。 如何正確 detect cycle? 用 int[] 表示每個點的

原创 LCA 類問題

LCA 類問題 LCA 類問題是二叉樹的高頻問題之一; 有隻給 root 的; 還有不給 root 給 parent pointer 的。 想面 FB,最好把各種二叉樹問題的 recursion / iteration 還有 r

原创 有向/無向圖的基本性質和操作

1. LeetCode上很多算法題目都可以抽象成 “圖” ,比如搜索類,tree類,迷宮問題,矩陣path問題等。 2. BFS和DFS比較 DFS 和 BFS 的比較 BFS 的time, space佔用都以 branching f

原创 拓撲排序DFS做法

(1) 給定一個有向圖,在拓撲排序中可以有很多個正確解,由若干小段的 list 組成。 (2) 正確的單序列順序(具體到一個list之間的元素)。 (3) 正確的全序列順序(list彼此之間的順序,可以有多個) e.g., 以下圖爲例

原创 各種Binary Tree定義

參考 wikipedia 各類二叉樹的定義 每個節點 children = 0 / 2,爲 full binary tree 簡單講就是沒有奇葩的單節點“拐彎”。 按 level order 從左到右依次(儘量)填滿,爲 comple

原创 無向DFS遍歷

無向圖的 DFS 要注意避免 “原路返回” 的情況 (1)僅僅依靠設 state = 1 是不行的,所以 dfs 裏最好有個參數,代表 “前一個節點”,這樣在下一步的搜索中可以直接跳過,又避免了誤判有環。 (2)對於起點0,他的pre

原创 三序遍歷以及Vertical Order

Binary Tree Preorder Traversal preorder 直接用 stack;inorder 用 stack + cur;postorder 用 stack + cur + prev; 遞歸 ✓ 迭代 ✓ pa

原创 Course Schedule I&II

Course Schedule 這題的本質就是,給你一個代表 graph 的 adjacency array,判斷 graph 是否有環。其實和 Graph Valid Tree 非常像。 DFS 找環性能優異,DFS找環相當於在DFS

原创 二分搜索

**區間縮小-> 剩下兩個下標->判斷兩個下標** 1. 這兩個下標根據先要end還是先要start先後順序會有不同。 2. 如果沒有target出現,令start = mid, end = mid不會影響結果。你只要讓問題的

原创 quick select

https://discuss.leetcode.com/topic/14611/java-quick-select public static int quickselect(int[] arr, int k){ int start

原创 回溯和dfs

回溯: 形狀像樹,狀態A/B,回到上一層,選不選 DFS:逐字匹配(座標移動),在bottom level的基礎上加東西! 回溯法與普通DFS的區別在於:回溯法需要還原之前的場景。 假設我們DFS處理的時候不剪枝,那麼就是這樣:

原创 Paint fence and house

Paint House (1) 二維dp = 兩個屬性: 一個屬性代表房子的下標,另外一個屬性代表那個下標房子的顏色。 這裏用二維是因爲每個房子都有三種狀態,需要用第二位區分這三種狀態。然而house robber只有一種狀態即可。 (2

原创 入門House Robber

House Robber (1) 先從 Top-Down 的角度來想,如果我們定義 maxProfit(n) 爲長度爲 n 的 array 中所能得到的最大利益的話,不難看出在計算 maxProfit(n) 的時候,它的值只和前兩個

原创 雙指針,窗口類

Minimum Size Subarray Sum 求length,就是雙指針! (1)永遠都是先用左右指針先處理,再移動左右指針(left<=right是條件) (2)right,left永遠指向當前等待處理的元素 (3)right <