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