還在為面試發愁麼?Leecode習題分類整理!分類刷題效果更佳!

2021-02-20 深度學習這件小事

連結 | https://zhuanlan.zhihu.com/p/104983442最近拿到了Google的實習offer,來給大家增強信心。加油!按照分類刷,每個分類的題目,解法類似,這樣就用一個思路解一類題目了:1. Pattern: Sliding window,滑動窗口類型滑動窗口類型的題目經常是用來執行數組或是鍊表上某個區間(窗口)上的操作。比如找最長的全為1的子數組長度。滑動窗口一般從第一個元素開始,一直往右邊一個一個元素挪動。當然了,根據題目要求,我們可能有固定窗口大小的情況,也有窗口的大小變化的情況。下面是一些我們用來判斷我們可能需要上滑動窗口策略的方法:這個問題的輸入是一些線性結構:比如鍊表呀,數組啊,字符串啊之類的Maximum Sum Subarray of Size K (easy)Smallest Subarray with a given sum (easy)Longest Substring with K Distinct Characters (medium)Fruits into Baskets (medium)No-repeat Substring (hard)Longest Substring with Same Letters after Replacement (hard)Longest Subarray with Ones after Replacement (hard)2. Pattern: two points, 雙指針類型雙指針是這樣的模式:兩個指針朝著左右方向移動(雙指針分為同向雙指針和異向雙指針),直到他們有一個或是兩個都滿足某種條件。雙指針通常用在排好序的數組或是鍊表中尋找對子。比如,你需要去比較數組中每個元素和其他元素的關係時,你就需要用到雙指針了。我們需要雙指針的原因是:如果你只用一個指針的話,你得來回跑才能在數組中找到你需要的答案。這一個指針來來回回的過程就很耗時和浪費空間了 — 這是考慮算法的複雜度分析的時候的重要概念。雖然brute force一個指針的解法可能會奏效,但時間複雜度一般會是O(n²)。在很多情況下,雙指針能幫助我們找到空間或是時間複雜度更低的解。上圖是說,我們在排好序的數組裡面找是否有一對數加起來剛好等於目標和一般來說,數組或是鍊表是排好序的,你得在裡頭找一些組合滿足某種限制條件Pair with Target Sum (easy)Squaring a Sorted Array (easy)Triplet Sum to Zero (medium)Triplet Sum Close to Target (medium)Triplets with Smaller Sum (medium)Subarrays with Product Less than a Target (medium)Dutch National Flag Problem (medium)3. Pattern: Fast & Slow pointers, 快慢指針類型這種模式,有一個非常出門的名字,叫龜兔賽跑。 咱們肯定都知道龜兔賽跑啦。但還是再解釋一下快慢指針:這種算法的兩個指針的在數組上(或是鍊表上,序列上)的移動速度不一樣。還別說,這種方法在解決有環的鍊表和數組時特別有用。通過控制指針不同的移動速度(比如在環形鍊表上),這種算法證明了他們肯定會相遇的。快的一個指針肯定會追上慢的一個(可以想像成跑道上面跑得快的人套圈跑得慢的人)。有些情形下,咱們不應該用雙指針,比如我們在單鍊表上不能往回移動的時候。一個典型的需要用到快慢指針的模式的是當你需要去判斷一個鍊表是否是回文的時候。Start of LinkedList Cycle (medium)Middle of the LinkedList (easy)4. Pattern: Merge Intervals,區間合併類型區間合併模式是一個用來處理有區間重疊的很高效的技術。在設計到區間的很多問題中,通常咱們需要要麼判斷是否有重疊,要麼合併區間,如果他們重疊的話。這個模式是這麼起作用的:給兩個區間,一個是a,另外一個是b。別小看就兩個區間,他們之間的關係能跑出來6種情況。詳細的就看圖啦。理解和識別這六種情況,灰常重要。因為這能幫你解決一大堆問題。這些問題從插入區間到優化區間合併都有。Intervals Intersection (medium)Conflicting Appointments (medium)5. Pattern: Cyclic Sort,循環排序這種模式講述的是一直很好玩的方法:可以用來處理數組中的數值限定在一定的區間的問題。這種模式一個個遍歷數組中的元素,如果當前這個數它不在其應該在的位置的話,咱們就把它和它應該在的那個位置上的數交換一下。你可以嘗試將該數放到其正確的位置上,但這複雜度就會是O(n^2)。這樣的話,可能就不是最優解了。因此循環排序的優勢就體現出來了。這些問題一般設計到排序好的數組,而且數值一般滿足於一定的區間如果問題讓你需要在排好序/翻轉過的數組中,尋找丟失的/重複的/最小的元素Find the Missing Number (easy)Find all Missing Numbers (easy)Find the Duplicate Number (easy)Find all Duplicate Numbers (easy)6. Pattern: In-place Reversal of a LinkedList,鍊表翻轉在眾多問題中,題目可能需要你去翻轉鍊表中某一段的節點。通常,要求都是你得原地翻轉,就是重複使用這些已經建好的節點,而不使用額外的空間。這個時候,原地翻轉模式就要發揮威力了。這種模式每次就翻轉一個節點。一般需要用到多個變量,一個變量指向頭結點(下圖中的current),另外一個(previous)則指向咱們剛剛處理完的那個節點。在這種固定步長的方式下,你需要先將當前節點(current)指向前一個節點(previous),再移動到下一個。同時,你需要將previous總是更新到你剛剛新鮮處理完的節點,以保證正確性。如果你被問到需要去翻轉鍊表,要求不能使用額外空間的時候Reverse a LinkedList (easy)Reverse a Sub-list (medium)Reverse every K-element Sub-list (medium)7. Pattern: Tree Breadth First Search,樹上的BFS這種模式基於寬搜(Breadth First Search (BFS)),適用於需要遍歷一顆樹。藉助於隊列數據結構,從而能保證樹的節點按照他們的層數列印出來。列印完當前層所有元素,才能執行到下一層。所有這種需要遍歷樹且需要一層一層遍歷的問題,都能用這種模式高效解決。這種樹上的BFS模式是通過把根節點加到隊列中,然後不斷遍歷直到隊列為空。每一次循環中,我們都會把隊頭結點拿出來(remove),然後對其進行必要的操作。在刪除每個節點的同時,其孩子節點,都會被加到隊列中。如果你被問到去遍歷樹,需要按層操作的方式(也稱作層序遍歷)Binary Tree Level Order Traversal (easy)Reverse Level Order Traversal (easy)Zigzag Traversal (medium)Level Averages in a Binary Tree (easy)Minimum Depth of a Binary Tree (easy)Level Order Successor (easy)Connect Level Order Siblings (medium)8. Pattern: Tree Depth First Search,樹上的DFS樹形DFS基於深搜(Depth First Search (DFS))技術來實現樹的遍歷。咱們可以用遞歸(或是顯示棧,如果你想用迭代方式的話)來記錄遍歷過程中訪問過的父節點。該模式的運行方式是從根節點開始,如果該節點不是葉子節點,我們需要幹三件事:需要區別我們是先處理根節點(pre-order,前序),處理孩子節點之間處理根節點(in-order,中序),還是處理完所有孩子再處理根節點(post-order,後序)。Binary Tree Path Sum (easy)All Paths for a Sum (medium)Sum of Path Numbers (medium)Path With Given Sequence (medium)Count Paths for a Sum (medium)9. Pattern: Two Heaps,雙堆類型很多問題中,我們被告知,我們拿到一大把可以分成兩隊的數字。為了解決這個問題,我們感興趣的是,怎麼把數字分成兩半?使得:小的數字都放在一起,大的放在另外一半。雙堆模式就能高效解決此類問題。正如名字所示,該模式用到了兩個堆,是不是很難猜?一個最小堆用來找最小元素;一個最大堆,拿到最大元素。這種模式將一半的元素放在最大堆中,這樣你可以從這一堆中秒找到最大元素。同理,把剩下一半丟到最小堆中,O(1)時間找到他們中的最小元素。通過這樣的方式,這一大堆元素的中位數就可以從兩個堆的堆頂拿到數字,從而計算出來。這種模式在優先隊列,計劃安排問題(Scheduling)中有奇效有時候,這種模式在涉及到二叉樹數據結構時也特別有用Find the Median of a Number Stream (medium)Sliding Window Median (hard)10. Pattern: Subsets,子集類型,一般都是使用多重DFS超級多的編程面試問題都會涉及到排列和組合問題。子集問題模式講的是用BFS來處理這些問題。把第一個數(1),加到之前已經存在的集合中:[[], [1]];把第二個數(5),加到之前的集合中得到:[[], [1], [5], [1,5]];再加第三個數(3),則有:[[], [1], [5], [1,5], [3], [1,3], [5,3], [1,5,3]].Subsets With Duplicates (easy)String Permutations by changing case (medium)Balanced Parentheses (hard)Unique Generalized Abbreviations (hard)11. Pattern: Modified Binary Search,改造過的二分當你需要解決的問題的輸入是排好序的數組,鍊表,或是排好序的矩陣,要求咱們尋找某些特定元素。這個時候的不二選擇就是二分搜索。這種模式是一種超級牛的用二分來解決問題的方式。對於一組滿足上升排列的數集來說,這種模式的步驟是這樣的:

首先,算出左右端點的中點。最簡單的方式是這樣的:middle = (start + end) / 2。但這種計算方式有不小的概率會出現整數越界。因此一般都推薦另外這種寫法:middle = start + (end — start) / 2

如果要找的目標改好和中點所在的數值相等,我們返回中點的下標就行

如果目標比中點在的值小(key < arr[middle]):將下一步搜索空間放到左邊(end = middle - 1)如果比中點的值大,則繼續在右邊搜索,丟棄左邊:left = middle + 1Order-agnostic Binary Search (easy)Ceiling of a Number (medium)Search in a Sorted Infinite Array (medium)Minimum Difference Element (medium)Bitonic Array Maximum (easy)12. Pattern: Top 『K』 Elements,前K個系列任何讓我們求解最大/最小/最頻繁的K個元素的題,都遵循這種模式。用來記錄這種前K類型的最佳數據結構就是堆了(譯者註:在Java中,改了個名,叫優先隊列(PriorityQueue))。這種模式藉助堆來解決很多這種前K個數值的問題。遍歷剩下的還沒訪問的元素,如果當前出來到的這個元素比堆頂元素大,那咱們把堆頂元素先刪除,再加當前元素進去。注意這種模式下,咱們不需要去排序數組,因為堆具有這種良好的局部有序性,這對咱們需要解決問題就夠了。Kth Smallest Number (easy)『K』 Closest Points to the Origin (easy)Top 『K』 Frequent Numbers (medium)Kth Largest Number in a Stream (medium)『K』 Closest Numbers (medium)Maximum Distinct Elements (medium)13. Pattern: K-way merge,多路歸併K路歸併能幫咱們解決那些涉及到多組排好序的數組的問題。每當你的輸入是K個排好序的數組,你就可以用堆來高效順序遍歷其中所有數組的所有元素。你可以將每個數組中最小的一個元素加入到最小堆中,從而得到全局最小值。當我們拿到這個全局最小值之後,再從該元素所在的數組裡取出其後面緊挨著的元素,加入堆。如此往復直到處理完所有的元素。取出堆頂元素(全局最小),將該元素放入排好序的結果集合裡面如果問題讓咱們合併多個排好序的集合,或是需要找這些集合中最小的元素Merge K Sorted Lists (medium)Kth Smallest Number in M Sorted Lists (Medium)Kth Smallest Number in a Sorted Matrix (Hard)Smallest Number Range (Hard)14. Pattern: 0/1 Knapsack (Dynamic Programming),0/1背包類型Equal Subset Sum Partition (medium)Minimum Subset Sum Difference (hard)15. Pattern: Topological Sort (Graph),拓撲排序類型拓撲排序模式用來尋找一種線性的順序,這些元素之間具有依懶性。比如,如果事件B依賴於事件A,那A在拓撲排序順序中排在B的前面。這種模式定義了一種簡單方式來理解拓撲排序這種技術。初始化
a) 藉助於HashMap將圖保存成鄰接表形式。
b) 找到所有的起點,用HashMap來幫助記錄每個節點的入度創建圖,找到每個節點的入度
a) 利用輸入,把圖建好,然後遍歷一下圖,將入度信息記錄在HashMap中找所有的起點
a) 所有入度為0的節點,都是有效的起點,而且我們講他們都加入到一個隊列中排序
a) 對每個起點,執行以下步驟
—i) 把它加到結果的順序中
— ii)將其在圖中的孩子節點取到
— iii)將其孩子的入度減少1
— iv)如果孩子的入度變為0,則改孩子節點成為起點,將其加入隊列中
b) 重複(a)過程,直到起點隊列為空。Topological Sort (medium)Tasks Scheduling (medium)Tasks Scheduling Order (medium)All Tasks Scheduling Orders (hard)大家好好練練這些題目,面試中遇到中高等難度的題目,應該就能解得不錯了。第二門則是單獨將動態規劃(DP)的題目進行了細分。提到算法,繞不開的重點和難點就肯定會包括動態規劃 -- DP,本文就把經典的DP問題按照分類列一下,大家可以按照RecursionTop-DownBottom-Up三種方式都練一練。俗話說,熟能生巧,多練才是提高算法的不二法寶。Grokking Dynamic Programming Patterns for Coding Interviews[1]1. 0/1 Knapsack, 0/1背包,6個題Equal Subset Sum Partition,相等子集劃分問題Minimum Subset Sum Difference,子集和的最小差問題Count of Subset Sum,相等子集和的個數問題2. Unbounded Knapsack,無限背包,5個題Minimum Coin Change,湊齊每個數需要的最少硬幣問題Maximum Ribbon Cut,絲帶的最大值切法3. Fibonacci Numbers,斐波那契數列,6個題Fibonacci numbers,斐波那契數列問題Minimum jumps to reach the end,蛙跳最小步數問題Minimum jumps with fee,蛙跳帶有代價的問題4. Palindromic Subsequence,回文子系列,5個題Longest Palindromic Subsequence,最長回文子序列Longest Palindromic Substring,最長回文子字符串Count of Palindromic Substrings,最長子字符串的個數問題Minimum Deletions in a String to make it a Palindrome,怎麼刪掉最少字符構成回文Palindromic Partitioning,怎麼分配字符,形成回文5. Longest Common Substring,最長子字符串系列,13個題Longest Common Substring,最長相同子串Longest Common Subsequence,最長相同子序列Minimum Deletions & Insertions to Transform a String into another,字符串變換Longest Increasing Subsequence,最長上升子序列Maximum Sum Increasing Subsequence,最長上升子序列和Shortest Common Super-sequence,最短超級子序列Minimum Deletions to Make a Sequence Sorted,最少刪除變換出子序列Longest Repeating Subsequence,最長重複子序列Subsequence Pattern Matching,子序列匹配Longest Bitonic Subsequence,最長字節子序列Longest Alternating Subsequence,最長交差變換子序列Strings Interleaving,交織字符串

參考資料

[1]Grokking Dynamic Programming Patterns for Coding Interviews: https://www.educative.io/courses/grokking-dynamic-programming-patterns-for-coding-interviews?aff=K7qB

[2]窮碼農:動態規劃及面試,學完這一篇,你就入門了:Dynamic Programming, 動態規劃,經典題目: https://zhuanlan.zhihu.com/p/89391817

[3]窮碼農:LeetCode到底應該怎麼刷?面試應該注意哪些問題?大公司到底怎麼進?來看看LC大神們的刷題攻略!: https://zhuanlan.zhihu.com/p/98580817

[4]刷完LeetCode是什麼水平,能拿到什麼水平的 offer ?: https://www.zhihu.com/question/32019460/answer/875114975

[5]https://leetcode.com/discuss/general-discussion/459286/Year-in-Review%3A-2019: https://link.zhihu.com/?target=https%3A//leetcode.com/discuss/general-discussion/459286/Year-in-Review%253A-2019

[6]窮碼農:別再埋頭刷LeetCode之:北美算法面試的題目分類,按類型和規律刷題,事半功倍: https://zhuanlan.zhihu.com/p/89392459

[7]Grokking the Coding Interview: Patterns for Coding Questions: https://www.educative.io/courses/grokking-the-coding-interview?aff=K7qB

相關焦點

  • 三十階非阿貝爾群分類
    這次是Hungerford上的習題,上次是Hungerford上的例題。
  • 「偷師」FB面試官發現:刷題超過300,再多刷也沒意義!
    像Baron這樣只顧埋頭盲刷、只感動自己的同學還真不少,有的甚至都不知道跪在哪裡。九章的令狐衝老師曾經說過:將核心、高頻的題目精刷200~300題就足以應付大廠面試了。再往多了意義並不大!考的不考的都刷,完全是浪費時間。
  • 人生必備:分類整理歸納法:知識管理體系+電腦資料+家居生活
    家居整理在這裡我簡單從三個方面講關於分類整理歸納法如何使用。一、理念來說分類整理歸納法。一般分類整理歸納分為三類也就是三個層級。這個三個層級適用於知識體系和電腦資料的整理。而家居生活分類整理歸納法主要在於具體的物品分類,家居歸納整理的理念主要強調行動路線的簡單極致即拿出、放回,就一個動作取一個動作放,而不是以前的拿出整理、放回-整理的兩個動作導致慢慢的拿出----不整理、放回不整理,到亂---找不到。
  • 分類是整理電腦桌面的好方法
    答案是使用你的分類能力。第一步,將你的工作內容分類。比如你是負責銷售工作的,那麼你的工作就可以分為客戶管理、促銷管理、市場管理等。如果你是項目經理,那麼你的工作可能分為立項項目、執行項目、結項項目等。如果是個人電腦那可以分為工作、學習、生活等幾類。你的工作內容你最了解了,你應該好好的分下類,這樣向領導匯報的時候也會覺得你特別有條理。
  • 檔案整理中的那些事兒丨檔案分類
    1、 將文件按其形成年度分類。   2、 跨年度一般應以文件籤發日期為準。   3、對於計劃、總結、預算、統計報表、表彰先進以及法規性文件等內容涉及不同年度的文件,統一按文件籤發日期判定所屬年度。   4、跨年度形成的會議文件歸入閉幕年。   5、跨年度辦理的文件歸入辦結年。
  • Excel分類匯總,你會嗎?
    點擊上方藍字  免費關注置頂公眾號或
  • FB、亞麻率先放出春招崗位,面試80%是原題!
    那到底該刷哪些題呢?九章的算法大神令狐衝將他刷3000道題、在矽谷頂尖IT公司工作多年的經驗,凝結成了《九章算法面試高頻題衝刺班》,很多學員都說押題超準:算法面試,到底先寫code再解釋,還是一邊寫code一邊解釋?
  • 常見的辦公用品分類
    而對於對於你每天都在接觸這些辦公用品,你有足夠的了解麼? *圖片素材來源於網絡 今天,我們來對辦公用品的類別進行一個比較詳細的整理,希望可以對你以後的辦公生活有所幫助。 羅技 M100 有線滑鼠  以上就是我對於辦公用品的一個簡單分類,希望可以對您的生活有所幫助。如果有其他見解,也歡迎一同探討。
  • Excel – 垃圾分類知多少?用選項按鈕設計一套單選題
    因為 7 月 1 日起,上海要實施垃圾強制分類啦。雖然剛開始有點麻煩,但垃圾分類是保護環境、造福子孫後代的大事情,我們每個人都應該大力支持、身體力行,為全國人民開個好頭!那麼問題來了,形形色色垃圾那麼多,如何儘快記住每種垃圾的分類呢?
  • Excel分類匯總變通用法,減輕工作量的神器
    分類匯總可以對數據分類求和、分類計數、分類求平均值我們常常需要對Excel中的某一個欄位分類求和、分類計數
  • 綜合分析題的十萬個為什麼—面試真題(66)
    這種題目,屬於負面社會現象分析題,之所以給你負面現象,主要考察的是尋找問題原因並提出對策的能力。所以我們對於這類題目不要過度去考慮影響,而是要深究原因。但凡是涉及原因的,往往分為主觀原因、客觀原因,表面原因、深層次原因,歷史原因、現實原因,或者是根據主體分類、根據事物構成因素分類等,合理掌握原因的分類,能夠讓我們的答題更有條理性。
  • 面試規則又變了!Senior級別居然考起了OOD...
    目前OOD出現的頻率非常高,只要以Java為主要語言的公司都有可能考,比如Amazon、Google、Uber,Bloomberg等公司就常考,所有大家務必重視起來。為了節約大家時間,我們整理出了科技大廠都愛考的高頻OOD真題合集免費送給大家,上面同學碰到的電梯設計也在裡面👇在Blind上就有人吐槽亞麻OOD還在問電梯和停車場問題,這類題雖萬年不變,但還是一問倒一片,原因就在OOD題目非常開放,沒有絕對的正確答案。
  • SQL面試必刷題(1) Case When
    SQL語言是每個開發人員必備的一種技能,本文對面試過程中常見的SQL面試題進行分類、匯總,每類題型包括一些例題,希望大家能夠舉一反三。
  • 程式設計師面試的刷題網站都在這了,想要的趕緊拿走!
    首先為什麼要刷題呢?
  • 新版職業分類表說明
    新版職業分類表使用說明一、職業釋義職業是參與社會分工,利用專門的知識和技能,為社會創造物質財富和精神財富,獲取合理報酬
  • 面試時,比起經驗,面試官更看重的是你的測試思維!
    前段時間,有3年多測試經驗的小夥伴面試時碰到一道題,沒有頭緒,題目是這樣的:給自己10秒鐘思考時間,如果是你,你會怎麼回答呢
  • excel中利用分類匯總進行數據統計,原來這麼有用
    顧名思義,分類匯總是對某一類別的欄位進行匯總,其實分類匯總的功能遠比字面看上去的更實用。      本文以下面的這個表為例給大家介紹一下在分類匯總中基本分類匯總、其他分類統計、多欄位分類匯總、對分類的數據進行分頁列印的操作。                  一、基本分類匯總。
  • Excel 分類列印,其實很簡單
    在設計選項卡下,分別設置報表布局【以表格形式顯示】和【重複所有項目標籤】,點擊左側的【分類匯總】按鈕,取消所有分類匯總。想學習更多的Excel技巧,提升工作效率,為你的工作升職加薪助力
  • 記帳時如何對開銷進行分類?
    其豐富程度基本能涵蓋大部分的日常開銷,但問題是這樣瑣碎細分的帳本,如果在記帳的時候不耐心選擇合適的分類,會把開銷雜亂的分散在各個小分類下,對最後歸帳造成更大的麻煩。如果進一步細看還有很多問題:比如說,飯卡、話費、教練課程、地鐵卡、購物卡之類的充值消費,錢好像並沒有真正被「花掉」,但確確實實產生了資金的變動,該怎麼歸類?
  • Google人工智慧面試·真·題(附參考答案+攻略)
    然而想要「應試」成功,考驗的不僅僅是開發人員的編程技術,還能側面考驗著參賽者的渠道來源是否廣泛、背景力量是否強大、腦洞迴路是否清奇……不過,夢是要做的,簡歷是要投的,說不準面試就來了呢?所以,我們需要為萬一砸到頭頂的面試,做好一萬的準備。