- 滑動窗口
應用場景:
(1) 輸入是線性數據結構,比如鏈表,數組,字符串
(2) 問題是找到最長或者最短的子串或者找到一個期望值
典型案例:
(1) 給定長度爲k,求和最大的子數組
(2) 有‘k’個不同字符的最長的子字符串
(3) 字符串迴文構詞法 - 雙指針
應用場景:
(1) 從有序數組(鏈表)中找到一組滿足特定約束的元素
(2) 這一組元素要麼是二元組,要麼是三元組,甚至多元組
典型案例:
(1) 求有序數組的平方
(2) 找到和爲0的三元組
(3) 比較包含回車的字符串 - 快速指針和慢速指針(慢指針在一圈內一定會與快指針相遇)
應用場景:
(1) 問題是解決鏈表或者數組內的循環
(2) 尋找一個鏈表中的某個特定的元素或者求鏈表的總長
典型案例:
(1) 循環鏈表
(2) 迴文鏈表
(3) 循環數組中的圈 - 合併區間(如果存在重疊區間需要找出這些重疊區間或者合併區間)
應用場景
(1) 生成沒有交集的列表
(2) 重疊區間
典型案列
(1) 區間交集
(2) 最大的CPU負載 - 循環排序(給定一定範圍內的連續數)
應用場景
(1) 涉及到給定範圍內的數字的有序數組
(2) 在有序或者輪轉數組中找到缺失或者重複或者最小的數
典型案例
(1) 找到缺失的數
(2) 找到缺失的最小正數 - 鏈接鏈表最佳翻轉方案(在一定的限制條件下翻轉鏈表,比如不能使用額外的空間)
應用場景:不能使用額外的空間的情況下翻轉鏈表
典型案列
(1) 翻轉子鏈表
(2) 翻轉子鏈表的每k個元素 - 廣度遍歷樹(基於廣度優先搜索技術遍歷樹,在跳到下一層級之前使用隊列來記錄當前層的所有節點,判斷條件爲隊列是否爲空)
應用場景:涉及到層次遍歷樹
典型案列
(1) 二叉樹的層次遍歷
(2) 之字形遍歷 - 深度遍歷樹(基於深度優先檢索技術遍歷樹,可以使用遞歸或者棧,判斷條件爲當前節點是否是葉子節點)
應用場景
(1) 前序,中序或者後序遍歷樹
(2) 需要搜索接近葉節點的一些任務
典型案列
(1) 求樹中值的和爲特定值的路徑
(2) 滿足某些條件的路徑的條數 - 雙堆(涉及二叉搜索)
應用場景
(1) 優先隊列,調度場景
(2) 從一個集合中找到最大,最小,居中的元素
(3) 以二叉樹結構爲特徵的問題
典型案列:找到一個序列的中值 - 子集
- 改進的二叉搜索(找出某個確定的元素,最好的方法就是二分搜索)
應用場景
(1) 無序的二叉搜索
(2) 在一個有序的無窮的列表中搜索
典型案列
一般的解答方法
(1) 找到中位數
(2) 如果查找的數等於該中位數,返回該中位數;如果查找的數小於該中位數,搜索列表的前面部分;否則搜索列表的後面部分 - 前k個元素
應用場景
(1)從給定的集合中找出最大的(最小的,最常出現的)前k個元素的問題
典型案列
(1) 前k個數
(2) 前k個頻繁出現的數字
一般解答方法
(1) 往小頂堆插入k個元素
(2) 遍歷剩餘的元素,如果發現一個比堆內的其中一個數據大時,移除堆頂元素,並將當前數插入 - K路合併
應用場景
(1) 以有序數組,列表或者矩陣爲特徵的問題
(2) 合併有序列表,或者是查找有序列表的最小元素的問題
典型案列
(1) 合併k路有序列表
(2) 可以得到最大和的k個數對
解題的一般方法
(1) 將每個隊列的第一個元素都插入小頂堆
(2) 取出堆頂(最小)元素,將其添加到合併的列表內
(3) 從堆頂移除最小的元素過後,將與移除元素相同的列表內的下一個元素插入堆
(4) 重複第二步和第三步,生成合並後的有序列表 - 拓撲排序
應用場景
(1) 處理沒有環的圖
(2) 問題涉及按順序更新所有對象
(3) 存在遵循特定順序的一類對象
典型案列
(1) 任務調度
(2) 樹的最小高度
解題的一般方法
(1) 初始化:使用hashmap將圖形存儲在相鄰列表中,找到所有的源節點,並使用hashmap保存節點的度數
(2) 創建圖並求得所有頂點的入度:根據輸入創建圖,並填充節點的度數
(3) 找到所有的源節點:標記爲“O”的節點爲源節點,將這些節點存儲到隊列
(4) 排序:對每個源節點,執行以下操作(將它添加到源節點,從圖中獲得無它所有的孩子節點,將每個孩子節點的度數減少1,如果孩子節點是源節點,將其加入源節點隊列),重複上一步,直到源節點的隊列爲空
面試編程題模式總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.