面試錦囊系列一直有收到大家的反饋,包括後臺內推成功的消息、朋友的同事從創業小公司成功跳到huawei等等,非常高興小破號的這些整理分享能夠真正地幫助到大家,以後也會繼續。為了更方便大家的交流溝通,我們建立了算法面試討論組,感興趣的小夥伴可以訂閱後臺回復"面試"加入
好了不廢話啦,今天文章的主題就是分享14種解決面試算法編程題的思路(來自educative[1]),經過本人之前筆試面試經驗證明確實確實非常非常高頻,一定要十分熟悉。對於每一種思路會給出
enjoy!
1、滑動窗口滑動窗口模式用於對給定數組或鍊表的特定窗口大小執行所需操作,例如查找包含所有1的最長子序列。滑動窗口從第一個元素開始,每次向右移動一個元素並根據要解決的問題調整窗口的長度。在某些情況下,窗口的大小保持不變,而在其他情況下,大小會增大或縮小。
應用場景okay,理解了滑動窗口原理之後,那麼什麼情況下我們會需要用到它呢?
題目要求查找最長/最短的子字符串、子數組或所需的值舉個慄子來看看實際應用滑動窗口解決的問題
2、雙指針雙指針的基本思想是使用兩個指針串聯迭代數據結構,知道一個或兩個指針達到某個條件停止。在排序數組或鍊表中搜索元素對時,兩個指針通常很有用, 例如將數組的每個元素與其他元素進行比較時。
通常我們需要兩個指針是因為如果只採用單個指針,必須不斷循環數組才能找到答案。這種解決方案雖然確實可行,但是對時間和空間複雜度來說明顯是低效的
應用場景問題為排序數組或鍊表,並且需要滿足某些約束的一組元素問題舉個慄子3、快慢指針也被稱為「龜兔算法」,基本思想是使用兩個指針以不同的速度在數組或鍊表中移動。在處理循環連結列表或數組時,此方法非常有用。通過以不同的速度移動(例如,在循環鍊表中),算法證明兩個指針必然會相遇。一旦兩個指針都處於循環循環中,快速指針就應該捕獲慢速指針。
應用場景舉個慄子4、合併區間合併間隔模式是處理重疊間隔的有效技術。在涉及間隔的許多問題中,你可以需要找到重疊間隔或合併間隔(如果它們重疊)。給定兩個間隔
應用場景出現「overlapping intervals」一詞舉個慄子5、樹的寬度優先搜索(Tree BFS)該模式基於廣度優先搜索(BFS)技術來遍歷樹,並使用隊列在跳到下一層之前記錄下該層的所有節點。使用這種方法可以有效地解決涉及以逐級順序遍歷樹的任何問題。Tree BFS模式的基本思想是將根節點push到隊列然後不斷迭代直到隊列為空。對於每次迭代,刪除隊列頭部的節點並「訪問」該節點。從隊列中刪除每個節點後,我們還將其所有子節點push進隊列。
應用場景舉個慄子6、樹的深度優先搜索(Tree DFS)樹DFS基於深度優先搜索(DFS)技術來遍歷樹。Tree DFS的基本思想是使用遞歸(或迭代方法的堆棧)在遍歷時跟蹤所有先前(父)節點。從樹的根開始,如果節點不是葉子,則需要做三件事:
決定是立即處理當前節點(先序遍歷),還是在之間處理兩個子節點(中序遍歷)或處理兩個子節點之後(後序遍歷)。為當前節點的兩個子節點進行兩次遞歸調用來處理它們。應用場景舉個慄子求根到葉子節點數字之和(LEETCODE)[19]從中序與後序遍歷序列構造二叉樹(LEETCODE)[21]7、Subset大量的編程面試問題涉及處理一組給定元素的排列和組合。Subsets模式描述了一種有效的廣度優先搜索(BFS)方法來處理所有這些問題。例如給定一個數組 [1, 5, 3]
將第一個數字(1)添加到所有現有子集,以創建新的子集: [[], [1]]繼續添加[[], [1], [5], [1, 5]][[], [1], [5], [1, 5], [3], [1, 3], [5, 3], [1, 5, 3]]應用場景舉個慄子本文參考資料[1]educative: https://hackernoon.com/14-patterns-to-ace-any-coding-interview-question-c5bb3357f6ed
[2]滑動窗口的最大值(劍指offer): https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788?tpId=13&tqId=11217&tPage=4&rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
[3]滑動窗口中位數(LEETCODE): https://leetcode-cn.com/problems/sliding-window-median/
[4]最小覆蓋子串(LEETCODE): https://leetcode-cn.com/problems/minimum-window-substring/
[5]K 個不同整數的子數組(LEETCODE): https://leetcode-cn.com/problems/subarrays-with-k-different-integers/
[6]無重複字符的最長自創(LEETCODE): https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
[7]接雨水(LEETCODE): https://leetcode-cn.com/problems/trapping-rain-water/
[8]長度最小的子數組(LEETCODE): https://leetcode-cn.com/problems/minimum-size-subarray-sum/
[9]環形鍊表(LEETCODE): https://leetcode-cn.com/problems/linked-list-cycle/
[10]相交鍊表(LEETCODE): https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
[11]環形鍊表入口節點(LEETCODE): https://leetcode-cn.com/problems/linked-list-cycle-ii/
[12]合併區間(LEETCODE): https://leetcode-cn.com/problems/merge-intervals/
[13]會議室(LEETCODE): https://leetcode-cn.com/problems/meeting-rooms-ii/
[14]Range模塊(LEETCODE): https://leetcode-cn.com/problems/range-module/
[15]區間列表的交集(LEETCODE): https://leetcode-cn.com/problems/interval-list-intersections/
[16]N叉樹的層序遍歷(LEETCODE): https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/
[17]二叉樹的層序遍歷(LEETCODE): https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
[18]二叉樹的鋸齒形層次遍歷: https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/
[19]求根到葉子節點數字之和(LEETCODE): https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/
[20]二叉樹的最大深度(LEETCODE): https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
[21]從中序與後序遍歷序列構造二叉樹(LEETCODE): https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
[22]路徑總和系列(LEETCODE): https://leetcode-cn.com/problems/path-sum/
[23]子集系列(LEETCODE): https://leetcode-cn.com/problems/subsets/
[24]字母大小寫全排列(LEETCODE): https://leetcode-cn.com/problems/letter-case-permutation/
[25]列舉單詞的全部縮寫(LEETCODE): https://leetcode-cn.com/problems/generalized-abbreviation/
[26]單詞子集(LEETCODE): https://leetcode-cn.com/problems/word-subsets/
本站qq群1003271085,加入微信群請回復「加群」
獲取一折本站知識星球優惠券,請回復「知識星球」
喜歡文章,點個在看