# Leetcode刷題學習筆記--心得統整 ## Useful references ### 面試準備 1. [軟體工程師求職 (1)履歷撰寫](https://www.ptt.cc/bbs/Tech_Job/M.1485621882.A.714.html) 2. [軟體工程師求職 (2)公告於市](https://www.ptt.cc/bbs/Tech_Job/M.1485622180.A.C4B.html) 3. [軟體工程師求職 (3)面試準備](https://www.ptt.cc/bbs/Tech_Job/M.1485622697.A.337.html) 4. [軟體工程師求職 (4)面試工具篇](https://www.ptt.cc/bbs/Tech_Job/M.1506226845.A.685.html) 5. [分享技術部落格: 酷殼](https://www.ptt.cc/bbs/Tech_Job/M.1485709329.A.A46.html) 6. [中年找工作心得](https://www.ptt.cc/bbs/Tech_Job/M.1524879194.A.7AA.html) 7. [軟體職缺準備心得](https://www.ptt.cc/bbs/Soft_Job/M.1657873542.A.6AB.html) ### 刷code心得 1. [LeetCode高效刷題心得分享](https://www.ptt.cc/bbs/Soft_Job/M.1602732913.A.BD9.html) 2. [COVID期間拿到Google FB 微軟 Offer Part3](https://www.ptt.cc/bbs/Soft_Job/M.1605589986.A.CBA.html) 3. [面試分享 Google/MS/Amazon/Roku](https://www.ptt.cc/bbs/Soft_Job/M.1628870944.A.C3B.html) 4. [Google TW SWE 面試心得(上)](https://www.ptt.cc/bbs/Soft_Job/M.1625756279.A.914.html) 5. [Google TW SWE 面試心得(下)](https://www.ptt.cc/bbs/Soft_Job/M.1625903945.A.52F.html) 6. [0到100的軟體工程師面試之路](https://ithelp.ithome.com.tw/users/20152262/ironman/5615) ### 薪資比較 1. [薪資透明化](https://www.ptt.cc/bbs/Soft_Job/M.1628006709.A.6E5.html) 2. [levels.fyi](https://www.levels.fyi/Salaries/Software-Engineer/Taiwan/) ### 推薦題庫 1. [Blind Curated 75](https://leetcode.com/list/xoqag3yj/), [(我的整理)](/B5OJc3twTAOJg6yEysmOoA) 2. [Leetcode 题解](http://www.cyc2018.xyz/%E7%AE%97%E6%B3%95/Leetcode%20%E9%A2%98%E8%A7%A3/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E7%9B%AE%E5%BD%95.html#%E5%89%8D%E8%A8%80) 3. [花花酱 LeetCode Problem List 题目列表](https://zxi.mytechroad.com/blog/leetcode-problem-categories/) 4. [Leetcode 101](https://github.com/changgyhub/leetcode_101/) 5. [NeetCode 150](https://neetcode.io/) 6. [Grind 75 questions](https://www.techinterviewhandbook.org/grind75) 7. [Lee215 good medium problems for interview and for practice](https://leetcode.com/discuss/feedback/4518909/happy-new-year-2024) ### 解題網站 1. [Grandyang](https://www.cnblogs.com/grandyang/) 2. [花花酱](https://zxi.mytechroad.com/blog/) 3. [wisdompeak](https://github.com/wisdompeak/LeetCode) 4. [Leetcode Solutions in Java Python C++ Php Go Typescript](https://leetcode.ca/) 5. [lzl124631x/LeetCode](https://github.com/lzl124631x/LeetCode) ### 教學網站 1. [LABULADONG 的算法网站](https://labuladong.github.io/algo/) 2. [LEARN C++](https://www.learncpp.com/) ### 面試時的反問 1. [面試時的反問](https://github.com/NeroCube/reverse-interview-zh-tw) ### 資訊科技產業專案設計(2021年秋季) 1. [課程進度表和公告](https://hackmd.io/@sysprog/info2021/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FSJ3QpJJNY) 2. [作業1](https://hackmd.io/@sysprog/info2021-homework1) 3. REACTO + Repeat: 重複提問,確認自己理解原本的要求 + Examples: 針對題目條件,舉出符合的案例,不限於特例 + Approach: 說明自己打算採用的方案 + Code: 撰寫程式 + Test: 若不能實際測試,那說明驗證程式的方案 ### [Google Tech Dev Guide](https://techdevguide.withgoogle.com/) ### 超牢記憶法Make It Stick 1. 努力回想才是記憶的關鍵(retrieve檢索) + 奮力回想(從題目到解答自己做一次) + 不要重複翻閱(不要只看code不動手做,試著回想解答的流程) 2. 穿插式練習(同時練習好幾種類型的題目) + 將練習當成比賽,才能把比賽當成是練習。 3. 每天回想學習過的東西,不能拿出筆記來參考 5. 費曼學習法(把學過的東西給12歲小孩聽得懂,看見事物的原始結構) 6. 找一個好的教練(簡答題考試) + 當一個在某個領域越不擅長時,就越容易高估自己的能力。 + 花幾分鐘為幾天後自己出一張考卷(周末把一個禮拜的每日精選做一次) + 考試的時機點,在大腦開始遺忘,但還沒完全遺忘之前。(隔天)(每天選一題隔天再做一次) {%youtube k-MOeKIkvfs %} --- + 演算法 + [Recursive](/231S57V1QcmoVFfMr2c5_A) 把問題切成相同的小題目。 + [Tree Traversal](/k_fIImRKQlSvwXp-OUMS9A) 分為pre-order, in-order,post-order和level-order,可以使用DFS或BFS. + [Depth-First-Search/Breadth-First-Search](/Rs3M7lf1TzOR0Lx_RhgpNg) 依深度或是廣度瀏覽所有的資料 + [Dynamic Programming](/474VEENxSVSGMRRRtfvetQ) 通常是求maximal或是minimal或是幾種方法的時候會用到。 + [Divide and Conquer](/KRNZe1ZKRIu79PJDR1KPLg) 將題目分成一樣的小題目,最後將結果合併起來。 + [Binary Search](/u7dufNJ-SAq7z0WmS-Semw) 在排序過的資料中,尋找目標值。用二分法找效率為O(logN)。 + [Two-pointers Binary Search](/qocJcScbSySS7xWbLbhaLg) 在排序過的1D或是2D vector中尋找想要的值。 + [Two Pointers](/gg-708HfRomJ66P7XX_QKQ) 通常為array中,使用前後兩個pointer來比較資料。 + [Fast Slow Pointers](/jO2mrGfpSiyZ_WlZIG7Aeg) 在linked-list中使用快慢pointer來解決問題。 + [Combination](/BRtCz4qGR-y4XevyNbchzg) 在所有的組合中,找出最佳的答案。 + [Sliding Window](/6lto0AbFTjCDxw7ohUkd3Q) 需要找出連續資料的關聯性。ex. substring, subarray. + [Backtracking](/h4ghhABcT9yyDC0JcSPRPw) + Sort algorithm + [Selection/Bubble/Insertion/Heap sort](/qxzTY7A4Sha_jFHpGJx5Wg) + [Bucket Sort](/K5s3M6TkS0q2HrRpCBpnnQ) 把數字分成一個一個的區段,ex: [0] : 0~9, [1] : 10~19, [2] : 20~29 + [Counting/Radix Sort](/I-kxuqAqSsiB6wlIddQpGA) + [Greedy + heap](/dqDTmv4jQMeuOOQYdzEG_Q) 如果問題是詢問max或是min,最直覺的解法就是依序把最大或是最小的數值相加,但是有時候必須刪減就是用heap提供的數值。 + [Greedy](/p9hSX0fpSQGwCUL3QF7cLA) 每次都把目前的狀態update到最有利的狀態。 + 資料結構 + [Set](/zoTq--X9Ri6RruOyCRcP1A) 只能儲存value,必把value當成key。 + [Map](/XfUiK191STCsppXWkgjbXQ) 把資料做成key-value的對應,可以快速找到key對應的value。</br>或是使用==客製的key==來對資料做統計。 + [stack](/7JBTdRgkQnmDaTlUacYuTA) [後進先出] 利用後進先出的特性,可以解決pair的問題或是反轉的效果。兩個stack也可以組成不同的特性。 + [Queue](/TNlZeQk_T-qqsLS7caigZQ) 先進先出,可以用在BFS。使用BFS通常可以解決最小數量的問題。 + [Double-end Queue(deque)](/Ls3-eUDST0KKDC2dNFGUYg) 一般的queue,只能pop_front和push_back,但是double-end queue可以pop_front/back和push_front/back。兩頭都可以做pop/push。 + [monotonic stack](/zEgS9fqBSzScisni9JNm_A) 一樣是stack,但是stack的內容有照一定的順序排列。遞增或遞減。找出前後比自己大或小的element。或是往左看往右看的最大值。 + [Binary Search Tree(BST)](/neNmzsZsRrmYQ-RtPWbYxA) 他是一個binary tree,但是準守著左邊的node小於root, 右邊的node大於root。 + [Graph](/dIurYyg1T5ue-KlCoj9reA) 有向圖和無向圖。 + [Disjoint set/Union Find](/wU2PrLOpSZmcgiu64UYnRQ) 使用root array來紀錄每個vertex的root或是parent node + Minimal spinning tree 最小weight和,可以把全部的node連起來的tree,通常使用greedy演算法,==每次都從最小的weight開始選,如果沒在graph裡面就加進來。== + Single Source Shortest Path Algorithm + [Dijkstra](/3IcoorPnRX66_oBNZd6Inw) 類似BFS,但是使用priority_queue來取最小weight路徑。 + [Shortest Path Faster Algorithm(SPFA)](/Uy6iSrZSTHa32c_tO6Zx_w) 使用vector和queue來記錄從source到每個node的最短路徑。可用在negative weight。 + [Floyd Warshall Algorithm](/reX2k61LTfa_UYKoroAodg) + [Topological sorting](/OeOB6NHGSvGkkhJIZd5Jog) 走訪有相依性的圖。 + [Trie](/QDEA_oTZTwOqDc35dWwOHw) 統計字串或是數字的bit + [Priority_queue](/m_6sQq4DS9u3TXsGYEcUTw) 統計最大最小值的出現。 + [Binary Index Tree(BIT)](/ogxY5ToqTT-RAZUqRhxbgw) 計算range sum可以達到 update是O(logN),getSum也是O(logN) 使用prefix sum只能達到 update是O(N), getSum是O(1) 使用array sum 只能達到 update是O(1), getSum是O(N) + [Segment Tree](/ctPbr-0MS72wc4rerLwD5Q) 和Binary Index Tree一樣,可以用來計算range sum。除此之外還可以計算range maximum/minimum,或是有效率的update一個區間的elements。 + 其他 + [Brute Force暴力破解](/eCH42Zj-RJ-9xo3rbFOCBg) 走訪所有的可能性,來找出最佳解。通常是面試時提出的第一個解法。從這邊也許可以延伸出sub-optimal或是optimal的解法。 + [Math數學解法](/ncPyegzYSdGq1G6xCP4gPQ) 有些時候分析完題目,發現用數學解反而更精簡。 + [Randomized](/zOR7woWNRwyVGtir5Lj_4A) 選取element並且每個的機率都一樣。 + [Bit Manipulation](/3VK0v_k7TpiJwtArT1otxg) 對bit做處理。 + [加法器設計](/fxpMUrR7Sd6bt_mrzUMkYg) + [prefix sum](/Io-i2knhQvaqqXSOKn2BcA) prefix_sum[i] = sum(nums[0:i - 1]); 前i個的和,適合用來解區段sum的題目。 + [subset sum](/FbvqYdi1SsCc-R96j0jVAA) 把一個數列分成若2個subset,求出兩個subset的特殊 關係。例如sum(s1) = sum(s2) 或是 sum(s1) - sum(s2) = target等等。 + [Interval](/fiSdDPowTOywK9g9Rl_jLg) 使用[start, end)來表示一個區間。 + [Line Sweep](/kAUQzqmBQKSfB8Kw7QSk1Q) 依序掃描x或是y,來得到答案。 + [Binary Lifting]() 尋找第k個parent的技巧。 + [two pass](/7HFHM30fTLq3SfBeW99DyQ) 題目的解答和前後都有關係。 + [解題技巧](/4qhm9YxKSZSs76s9qi0Low) + [小技巧/code snippet](/3I17t2spT6GDLFRftfEOZA) + [關鍵字/keyword](/jrO24dggStyloQy6nO3OZw) + [C++API/STL整理](/_LIBYTzATYWdOTpEu3dV0Q) + [C++ Operator Precedence](https://en.cppreference.com/w/cpp/language/operator_precedence) + [Learn C++](https://www.learncpp.com/) + [名詞解釋](/WXlO8tuoS1yyD_RGmyPGyQ) + [Time/Space Complexity](/nPCWaocaSEedyO0-07plZg) ###### tags: `leetcode` `刷題`