【面试锦囊】14种模式搞定面试算法编程题(1-7)
面試錦囊之知識整理系列
面試錦囊系列一直有收到大家的反饋,包括后臺內推成功的消息、朋友的同事從創業小公司成功跳到huawei等等,非常高興小破號的這些整理分享能夠真正地幫助到大家,以后也會繼續。為了更方便大家的交流溝通,我們建立了算法面試討論組,感興趣的小伙伴可以訂閱后臺回復"面試"加入
好了不廢話啦,今天文章的主題就是分享14種解決面試算法編程題的思路(來自educative[1]),經過本人之前筆試面試經驗證明確實確實非常非常高頻,一定要十分熟悉。對于每一種思路會給出
「基本原理(附圖)」
「應用場景」
「Leetcode或劍指offer具體栗子」
enjoy!
1、滑動窗口
滑動窗口模式用于對給定數組或鏈表的特定窗口大小執行所需操作,例如查找包含所有1的最長子序列。滑動窗口從第一個元素開始,每次向右移動一個元素并根據要解決的問題調整窗口的長度。在某些情況下,窗口的大小保持不變,而在其他情況下,大小會增大或縮小。
應用場景
okay,理解了滑動窗口原理之后,那么什么情況下我們會需要用到它呢?
問題輸入是線性數據結構,如鏈表、數組或字符串
題目要求查找最長/最短的子字符串、子數組或所需的值
舉個栗子
來看看實際應用滑動窗口解決的問題
滑動窗口的最大值(劍指offer)[2]
滑動窗口中位數(LEETCODE)[3]
最小覆蓋子串(LEETCODE)[4]
K 個不同整數的子數組(LEETCODE)[5]
2、雙指針
雙指針的基本思想是使用兩個指針串聯迭代數據結構,知道一個或兩個指針達到某個條件停止。在排序數組或鏈表中搜索元素對時,兩個指針通常很有用, 例如將數組的每個元素與其他元素進行比較時。
通常我們需要兩個指針是因為如果只采用單個指針,必須不斷循環數組才能找到答案。這種解決方案雖然確實可行,但是對時間和空間復雜度來說明顯是低效的 。在許多情況下,使用雙指針可以幫助你找到具有更好空間或時間復雜度的解決方案。
應用場景
問題為排序數組或鏈表,并且需要滿足某些約束的一組元素問題
數組中的元素集是一對,三元組,甚至是子數組
舉個栗子
N-sum問題(LEETCODE)
無重復字符的最長自創(LEETCODE)[6]
接雨水(LEETCODE)[7]
長度最小的子數組(LEETCODE)[8]
3、快慢指針
也被稱為“龜兔算法”,基本思想是使用兩個指針以不同的速度在數組或鏈表中移動。在處理循環鏈接列表或數組時,此方法非常有用。通過以不同的速度移動(例如,在循環鏈表中),算法證明兩個指針必然會相遇。一旦兩個指針都處于循環循環中,快速指針就應該捕獲慢速指針。
應用場景
鏈表或數組循環
用于找中間元素
需要知道某個元素的位置或鏈表的總長度
舉個栗子
環形鏈表(LEETCODE)[9]
相交鏈表(LEETCODE)[10]
環形鏈表入口節點(LEETCODE)[11]
4、合并區間
合并間隔模式是處理重疊間隔的有效技術。在涉及間隔的許多問題中,你可以需要找到重疊間隔或合并間隔(如果它們重疊)。給定兩個間隔 和 ,可能存在6中不同的間隔交互情況:
應用場景
要求生成僅具有互斥間隔的列表
出現“overlapping intervals”一詞
舉個栗子
合并區間(LEETCODE)[12]
會議室(LEETCODE)[13]
Range模塊(LEETCODE)[14]
區間列表的交集(LEETCODE)[15]
5、樹的寬度優先搜索(Tree BFS)
該模式基于廣度優先搜索(BFS)技術來遍歷樹,并使用隊列在跳到下一層之前記錄下該層的所有節點。使用這種方法可以有效地解決涉及以逐級順序遍歷樹的任何問題。Tree BFS模式的基本思想是將根節點push到隊列然后不斷迭代直到隊列為空。對于每次迭代,刪除隊列頭部的節點并“訪問”該節點。從隊列中刪除每個節點后,我們還將其所有子節點push進隊列。
應用場景
涉及到層序遍歷樹
舉個栗子
N叉樹的層序遍歷(LEETCODE)[16]
二叉樹的層序遍歷(LEETCODE)[17]
二叉樹的鋸齒形層次遍歷[18]
6、樹的深度優先搜索(Tree DFS)
樹DFS基于深度優先搜索(DFS)技術來遍歷樹。Tree DFS的基本思想是使用遞歸(或迭代方法的堆棧)在遍歷時跟蹤所有先前(父)節點。從樹的根開始,如果節點不是葉子,則需要做三件事:
決定是立即處理當前節點(先序遍歷),還是在之間處理兩個子節點(中序遍歷)或處理兩個子節點之后(后序遍歷)。
為當前節點的兩個子節點進行兩次遞歸調用來處理它們。
應用場景
涉及樹的先序、中序或者后續遍歷問題
如果問題涉及搜索節點離葉子更近的目標
舉個栗子
求根到葉子節點數字之和(LEETCODE)[19]
二叉樹的最大深度(LEETCODE)[20]
從中序與后序遍歷序列構造二叉樹(LEETCODE)[21]
路徑總和系列(LEETCODE)[22]
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]]
應用場景
需要找到給定集合的組合或排列的問題
舉個栗子
子集系列(LEETCODE)[23]
字母大小寫全排列(LEETCODE)[24]
列舉單詞的全部縮寫(LEETCODE)[25]
單詞子集(LEETCODE)[26]
本文參考資料
[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/interp-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-interps/
[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/
-?END?-
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的【面试锦囊】14种模式搞定面试算法编程题(1-7)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面试锦囊】14种模式搞定面试算法编程题
- 下一篇: 用Python编写小工具下载OSM路网数