【面试锦囊】14种模式搞定面试算法编程题(8-14)
面試錦囊之知識整理系列
面試錦囊系列一直有收到大家的反饋,包括后臺內(nèi)推成功的消息、朋友的同事從創(chuàng)業(yè)小公司成功跳到huawei等等,非常高興小破號的這些整理分享能夠真正地幫助到大家,以后也會繼續(xù)。為了更方便大家的交流溝通,我們建立了算法面試討論組,感興趣的小伙伴可以訂閱后臺回復(fù)"面試"加入
好了不廢話啦,今天文章的主題繼續(xù)分享上一篇未寫完的部分,14種模式搞定面試算法編程題(PART I)。經(jīng)過本人之前筆試面試經(jīng)驗證明確實確實非常非常高頻,一定要十分熟悉。對于每一種思路會給出
「基本原理(附圖)」
「應(yīng)用場景」
「Leetcode或劍指offer具體栗子」
enjoy!
8、循環(huán)排序
循環(huán)排序模式描述了一種處理涉及包含給定范圍內(nèi)的數(shù)字的數(shù)組問題的有趣方法。其一次遍歷數(shù)組一個數(shù)字,如果正在迭代的當(dāng)前數(shù)字不是正確的索引,則將其與正確索引處的數(shù)字交換。
應(yīng)用場景
涉及給定范圍內(nèi)的數(shù)字的排序數(shù)組
要求在已排序/旋轉(zhuǎn)的數(shù)組中找到缺失/重復(fù)/最小的數(shù)字
舉個栗子
缺失數(shù)字(LEETCODE)[1]
尋找重復(fù)數(shù)(LEETCODE)[2]
缺失的第一個正數(shù)(LEETCODE)[3]
9、就地反轉(zhuǎn)鏈表
在許多問題中,可能會要求我們反轉(zhuǎn)鏈表的一組節(jié)點之間的鏈接。通常,約束就是需要就地執(zhí)行此操作,即使用現(xiàn)有節(jié)點對象而不使用額外內(nèi)存。這是上述模式有用的地方。
此模式一次反轉(zhuǎn)一個節(jié)點,從一個指向鏈表頭部的變量(當(dāng)前)開始,一個變量(上一個)將指向已處理的上一個節(jié)點。以鎖步方式,將通過將當(dāng)前節(jié)點指向前一個節(jié)點,然后再轉(zhuǎn)到下一個節(jié)點來反轉(zhuǎn)當(dāng)前節(jié)點。此外,更新變量“previous”以始終指向您已處理的上一個節(jié)點。
應(yīng)用場景
就地反轉(zhuǎn)鏈表
舉個栗子
反轉(zhuǎn)鏈表(LEETCODE)[4]
反轉(zhuǎn)鏈表II(LEETCODE)[5]
10、Two heaps
在許多問題中,給出了一系列元素,需要我們將其分成兩部分。為了解決這個問題,我們想要知道一個部分中的最小元素和另一個部分中的最大元素。這種模式是解決此類問題的有效方法。
這種模式使用兩個堆:找到最小元素的Min Heap和找到最大元素的Max Heap。該模式的工作原理是將前半部分的數(shù)字存儲在Max Heap中,這是因為我們希望在上半部分找到最大的數(shù)字。然后將數(shù)字的后半部分存儲在Min Heap中,因為我們希望在后半部分找到最小的數(shù)字。在任何時候,可以從兩個堆的頂部元素計算當(dāng)前數(shù)字列表的中值。
應(yīng)用場景
優(yōu)先隊列,調(diào)度等情況
找到集合中的最小/最大/中值元素
有時,在以二叉樹數(shù)據(jù)結(jié)構(gòu)為特征的問題中很有用
舉個栗子
數(shù)據(jù)流的中位數(shù)(LEETCODE)[6]
滑動窗口的最大值(劍指offer)[7]
11、Modified binary search
無論何時給定排序數(shù)組,鏈表或矩陣,并要求查找某個元素,你可以使用的最佳算法是二分搜索。此模式描述了處理涉及二分搜索的所有問題的有效方法。二分搜索這么經(jīng)典的思路我就不多介紹啦,直接看一個可視化復(fù)習(xí)一下
舉個栗子
搜索旋轉(zhuǎn)排序數(shù)組(LEETCODE)[8]
尋找兩個有序數(shù)組的中位數(shù)(LEETCODE)[9]
尋找旋轉(zhuǎn)排序數(shù)組中的最小值(LEETCODE)[10]
12、Top K
任何要求我們在給定集合中找到最大/最小/頻繁“K”元素的問題都屬于這種模式。
跟蹤'K'元素的最佳數(shù)據(jù)結(jié)構(gòu)是Heap。這種模式將利用Heap來解決從一組給定元素一次處理'K'元素的多個問題。大致思路是這樣的:
根據(jù)問題將'K'元素插入到最小堆或最大堆中;
迭代剩余的數(shù)字,如果找到一個比堆中的數(shù)字大的數(shù)字,則刪除該數(shù)字并插入較大的數(shù)字
應(yīng)用場景
要求找到給定集合的最大/最小/頻繁“K”元素;
要求對數(shù)組進(jìn)行排序以找到確切的元素
舉個栗子
前K個高頻元素(LEETCODE)[11]
前K個高頻單詞(LEETCODE)[12]
第k個排列(LEETCODE)[13]
13、K-way Merge
K-way Merge可以用于解決涉及一組排序數(shù)組的問題。
給出'K'排序數(shù)組,可以使用Heap有效地執(zhí)行所有數(shù)組的所有元素的排序遍歷。我們可以在Min Heap中push每個數(shù)組的最小元素以獲得最小值。獲得總體最小值后,將下一個元素從同一個數(shù)組推送到堆中。然后,重復(fù)此過程以對所有元素進(jìn)行排序遍歷。
應(yīng)用場景
適用于排序的數(shù)組,列表或矩陣
問題要求合并排序列表,在排序列表中查找最小元素等
舉個栗子
合并兩個有序鏈表(LEETCODE)[14]
合并K個排序鏈表(LEETCODE)[15]
丑數(shù)系列(LEETCODE)[16]
14、Topological sort
拓?fù)渑判蛴糜诓檎冶舜艘蕾嚨脑氐木€性排序。例如,如果事件“B”依賴于事件“A”,則“A”在拓?fù)渑判蛑形挥凇癇”之前。流程大概是這樣的:
初始化。
a) ?使用散列映射將圖存儲在鄰接表中
b) 要查找所有sources,使用HashMap維護(hù)入度的計數(shù)
建立圖并找出所有頂點的入度
a) 從輸入構(gòu)建圖形并填充內(nèi)部HashMap
查找所有的sources
所有入度為“0”的節(jié)點被認(rèn)為是source,并存入隊列中
排序
將其添加到已排序列表中
從圖中獲取它的所有子結(jié)點
將每個子節(jié)點的入度減一
如果某個子節(jié)點的入度為“0”,則將其加入隊列中
對于每一個source,do:
重復(fù)上述步驟直到隊列為空
應(yīng)用場景
需要處理沒有定向循環(huán)的圖
要求按排序順序更新所有對象
如果有一組遵循特定順序的對象
舉個栗子
課程表系列(LEETCODE)[17]
矩陣中的最長遞增路徑(LEETCODE)[18]
序列重建(LEETCODE)[19]
本文參考資料
[1]
缺失數(shù)字(LEETCODE): https://leetcode-cn.com/problems/missing-number/
[2]尋找重復(fù)數(shù)(LEETCODE): https://leetcode-cn.com/problems/find-the-duplicate-number/
[3]缺失的第一個正數(shù)(LEETCODE): https://leetcode-cn.com/problems/first-missing-positive/
[4]反轉(zhuǎn)鏈表(LEETCODE): https://leetcode-cn.com/problems/reverse-linked-list/
[5]反轉(zhuǎn)鏈表II(LEETCODE): https://leetcode-cn.com/problems/reverse-linked-list-ii/
[6]數(shù)據(jù)流的中位數(shù)(LEETCODE): https://leetcode-cn.com/problems/find-median-from-data-stream/
[7]滑動窗口的最大值(劍指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
[8]搜索旋轉(zhuǎn)排序數(shù)組(LEETCODE): https://leetcode-cn.com/problems/search-in-rotated-sorted-array/
[9]尋找兩個有序數(shù)組的中位數(shù)(LEETCODE): https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
[10]尋找旋轉(zhuǎn)排序數(shù)組中的最小值(LEETCODE): https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
[11]前K個高頻元素(LEETCODE): https://leetcode-cn.com/problems/top-k-frequent-elements/
[12]前K個高頻單詞(LEETCODE): https://leetcode-cn.com/problems/top-k-frequent-words/
[13]第k個排列(LEETCODE): https://leetcode-cn.com/problems/permutation-sequence/
[14]合并兩個有序鏈表(LEETCODE): https://leetcode-cn.com/problems/merge-two-sorted-lists/
[15]合并K個排序鏈表(LEETCODE): https://leetcode-cn.com/problems/merge-k-sorted-lists/
[16]丑數(shù)系列(LEETCODE): https://leetcode-cn.com/problems/ugly-number-ii/
[17]課程表系列(LEETCODE): https://leetcode-cn.com/problems/course-schedule/
[18]矩陣中的最長遞增路徑(LEETCODE): https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix/
[19]序列重建(LEETCODE): https://leetcode-cn.com/problems/sequence-reconstruction/
-?END?-
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復(fù)“加群”獲取一折本站知識星球優(yōu)惠券,請回復(fù)“知識星球”喜歡文章,點個在看 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的【面试锦囊】14种模式搞定面试算法编程题(8-14)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【算法知识】详解直接插入排序算法
- 下一篇: 【面试锦囊】14种模式搞定面试算法编程题