今天出去玩,買了好多東西,只想趕快把這篇趕出來。
DFS:碰到一個新節點時,先從這個新節點開始往下做,所以用 FILO 的 stack or 等價的遞迴來做。
通常是走遍 matrix,但 tree 的 3 種 traversal 也算是 dfs
for 所有元素:
if 條件成立:
dfs(x, y)
紀錄 visited
通常會需要紀錄已經拜訪的元素,或是更改原來的元素做標記,以避免重複訪問造成無窮迴圈
額外紀錄 visited 會佔空間,但面試時要先釐清是否可以更改原先的 input。
判斷 bound
個人習慣是
遞迴時:無論如何先走下一步,再從最前面的 basic case 判斷是否越界
迭代時:先判斷下一步是否越界,才決定是否加進 stack。
方向
若是經典的走 matrix 的四個方向,可以用 directions = [-1, 0, 1, 0, -1],每相臨兩個代表一個方向。
695. Max Area of Island (Medium)
79. Word Search (Medium)
dfs 的實作,包含怎麼利用已經找到的結果(例如 79),都會影響整體速度。
可以多參考別人的 code 測看看哪裡比較快,
而且因為模式都很相像,可以寫一個自己最喜歡的版本的 pseudo code,方便以後把熟悉度練上去。
.. 好想睡覺ㄛ
本來想寫 trie 和 graph 卻一直拖