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