1. 程式人生 > >scarletthln 關於算法的一點總結

scarletthln 關於算法的一點總結

依賴 balance fixed ... 分別是 poi stream 復雜 bar

1. 分解問題的角度: fix 某一維度,嘗試另一維度上的所有可能
a. 可能是array的(i, j)pointers, b. 可能是矩形的長與寬, c. 可能是tree的每一個subtree, d. 可能是情景題的每一對pair...
2. 求所有解的, 暴力上backtracking吧
3. 如果問最短/最少的, 先想BFS、DP這對好基友:忘了bfs了
4. 如果環相關/重復訪問, DFS + visited state雄起:忘了visited了
5. 如果問連通性, 靜態靠DFS/BFS, 動態靠Union-Find:忘了動態了
6. 如果有依賴性, 想想Topologic order 和indegree


7. DAG的萬能套路 DFS+memo, 再到DP
8. 建圖的時候想想vertex, edges/neighbors, cost分別是什麽。如果出現cycle, 別忘了給vertex增加狀態
9. 樹相關, 永遠有backtracking 和 pure recursion兩條路:啥是pure recursion啊?
10. 遇到字符串/字典/char board相關的, Trie tree總是可以試試的:用得少別怪我
11. Range裏求最大/最小/sum等特征值, Segment tree會是不錯的選擇:用得少別怪我
12. Matrix和Array通常都是1. Two Pointers, 2. Sliding Window(fixed & not fixed), 3. DP

13. DP題型往往是: a. 問你可不可以啊, 數量有多少啊, b. 兩個string上match來match去的, c. 1D/2D array 相關, d. 博弈遊戲
14. 破解DAG cycle想想哪個維度是具有單調性的: 常見的steps, directions, paths
15. Reversed idea非常重要, 可能會幫助你破題: 最長可能是某種最短的反面, 最多可能是某種最少的反面, obstacle的反面是reachable, subarray的反面是array中的剩下元素, left的反面是right。:用得少別怪我
16. Look up別忘了HashMap/HashSet, HashMap + DLL是常見hybrid數據結構
。:用得少別怪我

17. 找規律試試那些旁門左道: 單調Stack/雙端Deque::用得少別怪我
18. 排序大法總是可以試試的::用得少別怪我
19. 時空復雜度: a. backtracking相關, 想想branching factor和height
b. DFS+memo/DP相關, 想想state數量, 以及每個state的cost
c. tree相關, 總是要考慮balanced 和 single linked list的
d. array/矩陣相關, 先數數你有多少個for loops
e. binary search application相關, 別忘了check function開銷
f. stack/queue/deque相關, 常說的吃進去一次又吐出來一次
g. Java的string是朵奇葩, string concatenation不是免費的
h. 沒人知道n是什麽, 先告訴別人m,n,k,V,E是什麽
20. 比較不同sol的trade offs: a. Time/Space complexity異同:頭一次聽說
b. online/offline算法
c. pre-computation cost
d. 不同APIs的call frequency差異會導致不同的時間要求
e. extension: 是否適用於generic parameters/stream input
f. 線程安全/large scale

scarletthln 關於算法的一點總結