算法工程師思維導圖 | 數據結構與算法

2021-02-20 機器學習實驗室

賣萌屋的妹子們(劃掉)作者團整理的算法工程師思維導圖,求職/自我提升/查漏補缺神器。該手冊一共分為數據結構與算法、數學基礎、統計機器學習和深度學習四個部分。

點擊這裡查看具體使用指南。該手冊有兩種獲取方式:

下面是數據結構與算法部分~

數據結構

二維矩陣/直方圖最大距形面積

矩陣最大面積:https://leetcode-cn.com/problems/maximal-rectangle/solution/zui-da-ju-xing-by-leetcode/

直方圖dp

最小棧

https://leetcode-cn.com/problems/min-stack/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-38/

LRU:雙向鍊表

https://leetcode-cn.com/problems/lru-cache/Least Recently Used

尋找重複數-環的入口

https://leetcode-cn.com/problems/find-the-duplicate-number/

快慢指針,相遇後,從頭髮起一個指針,按相同速度走,相遇即使環的入口

併查集

http://www.cnblogs.com/cyjb/p/UnionFindSets.html

字節跳動大闖關

https://blog.csdn.net/sinat_27705993/article/details/82053102

求不同併查集的個數 多一個count,每union一次count就減1

島嶼個數

https://leetcode-cn.com/problems/number-of-islands/solution/dfs-bfs-bing-cha-ji-python-dai-ma-java-dai-ma-by-l/

多開一個放0的島

  前序:= 自頂向下

curr=stack.pop()
print(curr.val)
stack.push(curr.right)
stack.push(curr.left)

中序:加一個記錄

 curr = stack.pop()
if curr in cache:
res.append(curr.val)
continue
cache.add(curr)
stack.append(curr.right)
stack.append(curr)
stack.append(curr.left)

後序:同中序 = 自底向上

二叉樹的最近公共祖先

三個條件滿足兩個就是True:1.左子樹包含p1或p2 2.右子樹包含p1或p2 3.自己是p1或p2

二分查找樹

AVL:https://mp.weixin.qq.com/s/dYP5-fM22BgM3viWg4V44A

為啥有了BST和AVL還需要紅黑樹?https://zhuanlan.zhihu.com/p/72505589

AVL每次進行插入/刪除節點的時候,幾乎都會破壞平衡樹的第二個規則,進而我們都需要通過左旋和右旋來進行調整,使之再次成為一顆符合要求的平衡樹 如果在那種插入、刪除很頻繁的場景中,平衡樹需要頻繁著進行調整,這會使平衡樹的性能大打折扣,為了解決這個問題,於是有了紅黑樹

二叉樹中的最大路徑和

https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/

完全二叉樹插入

https://blog.csdn.net/psc0606/article/details/48742239

利用完全二叉樹的性質,找到要插入的位置,先判斷左子樹的最右結點與右子樹的最右結點高度,如果相等,只需要插入到左子樹即可,否則插入右子樹

完全二叉樹節點數

https://leetcode-cn.com/problems/count-complete-tree-nodes/solution/er-fen-cha-zhao-by-xu-yuan-shu/

連續子數組和為k的倍數

https://leetcode-cn.com/problems/continuous-subarray-sum/solution/lian-xu-de-zi-shu-zu-he-by-leetcode/

和為K的子數組

https://leetcode-cn.com/problems/subarray-sum-equals-k/

連續區間和為K,用字典存儲累計和

求最長非重複字符串長度

https://blog.csdn.net/zd_nupt/article/details/82669299

做個hash_table表,記錄每個字符的位置。碰到重複的就求兩個重複字符之間的距離

查找

查找最小值/翻轉點 只判斷mid-right是否被翻轉

查找固定target 1.判斷mid-right是否被翻轉,找到升序的方向 2.跟升序區間的left/right和mid比看在不在,不在就搜索另一個空間

存在重複,尋找最小值 當num[mid]==num[right]時,right-=1 因為左閉右開,mid和right中存在別的值 [0,1,1,1] [1,1,0,1] [1, 0, 1, 1, 1] [1, 1, 1, 1] 特殊情況下時間複雜度為O(N)

bug-free寫法:左閉右開,先寫排除中位數的邏輯

https://www.zhihu.com/question/36132386/answer/97729337 lower/upper bound

尋找峰值

左閉右開,往高的地方走https://leetcode-cn.com/explore/learn/card/binary-search/210/template-ii/841/

尋找重複數

https://leetcode-cn.com/problems/find-the-duplicate-number/solution/xun-zhao-zhong-fu-shu-by-leetcode/

雙數組中位數

https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-2/

找出第K小的距離對

https://leetcode-cn.com/problems/find-k-th-smallest-pair-distance/solution/hei-ming-dan-zhong-de-sui-ji-shu-by-leetcode/

二分查找 + 雙指針

階乘函數後K個零

https://leetcode-cn.com/problems/preimage-size-of-factorial-zeroes-function/solution/jie-cheng-han-shu-hou-kge-ling-by-leetcode/

乘法表中第k小的數

https://leetcode-cn.com/problems/kth-smallest-number-in-multiplication-table/

給定高度m 、寬度n 的一張 m * n的乘法表,以及正整數k,你需要返回表中第k 小的數字。

迷宮中的最短路徑

https://blog.csdn.net/qq_28468707/article/details/102786710

字符串A和B的最小相似度

https://leetcode-cn.com/problems/k-similar-strings/solution/xiang-si-du-wei-k-de-zi-fu-chuan-by-leetcode/

抖音紅人

DFS:https://blog.csdn.net/anlian523/article/details/82557468

BFS:https://blog.csdn.net/u014253011/article/details/82556976

對於每個用戶,遍歷粉絲數(記錄visited)

八皇后

https://blog.csdn.net/handsomekang/article/details/41308993

一行一行依次遍歷(從上往下),決定放在哪列(從左往右),這樣就不用判斷行衝突,只需要判斷列衝突和主斜線副斜線衝突.

對角線=>斜率為1 => abs(A[i]-A[j])==abs(i-j)

全排列

https://leetcode-cn.com/problems/permutations/solution/

有重複數字的全排列 sort:https://leetcode-cn.com/problems/permutations-ii/

復原IP位址

https://blog.csdn.net/OneDeveloper/article/details/84946233

dfs,如果加完3個「.」了則判斷是否符合條件,否則繼續加(start,start+3)

連通島嶼個數

字節-部門合併:https://blog.csdn.net/zd_nupt/article/details/82669299

dfs:每次遍歷到1,則把聯通的島置為0

兩數之和

https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/solution/liang-shu-zhi-he-ii-shu-ru-you-xu-shu-zu-by-leetco/

在已排序的數組中找到兩個數,和為target

雙指針暴力求解 n^2 字典求解 時間n,空間n

我們使用兩個指針,初始分別位於第一個元素和最後一個元素位置,比較這兩個元素之和與目標值的大小。如果和等於目標值,我們發現了這個唯一解。如果比目標值小,我們將較小元素指針增加一。如果比目標值大,我們將較大指針減小一。移動指針後重複上述比較知道找到答案。時間 n,空間1

數組中兩數相減的最大值

https://blog.csdn.net/fkyyly/article/details/83930343

非排序數組中兩個數相減(前面減後面)的最大值。i<j, max(a[i]-a[j])

if a[i]-a[j]>0: j++ else: i = j, j++

最小覆蓋子串

https://leetcode-cn.com/problems/minimum-window-substring/solution/zui-xiao-fu-gai-zi-chuan-by-leetcode-2/

和為K的子數組

https://blog.csdn.net/a546167160/article/details/94401251

當區間和等於target,再向後遍歷,可以i+或j+,但是j+可能會越界,因此選擇i+

乘積小於K的子數組

https://leetcode-cn.com/problems/subarray-product-less-than-k/solution/cheng-ji-xiao-yu-kde-zi-shu-zu-by-leetcode/

排序

插入排序:穩定

把後面的某個一次次插到前面,再管後面的,第一次確定的位置可能不是最終位置

冒泡排序:穩定

把某個確定好,再管其他的,第一次確定的位置是最終位置

快速排序

https://blog.csdn.net/qq_36528114/article/details/78667034

快排優化:

    1. 在個數小於N時使用插入排序

    3. 加入三取樣切分 //省去了對重複元素的比較,性能接近線性

歸併排序:穩定

原地歸併:直接把合適的片段swap過去

https://blog.csdn.net/xiaolewennofollow/article/details/50896881

兩個片段的交換需要三次逆轉:分別逆轉[1, i]和[i+1,n] 再逆轉[1, n]

大數據歸併應用較多

數組中的逆序對

https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/

區間和的個數在某個區間

https://leetcode-cn.com/problems/count-of-range-sum/

鍊表排序

https://www.cnblogs.com/TenosDoIt/p/3666585.html

https://leetcode-cn.com/problems/sort-list/solution/sort-list-gui-bing-pai-xu-lian-biao-by-jyd/

         https://www.cnblogs.com/fengziwei/p/7875355.html

動態規劃

編輯距離

https://zhuanlan.zhihu.com/p/80682302

最長回文子序列/子串

最長回文子序列:bbbab -> bbbb

https://leetcode-cn.com/problems/longest-palindromic-subsequence/solution/dong-tai-gui-hua-si-yao-su-by-a380922457-3/

最長回文子串:bbbab -> bbbhttps://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode/

1. 排序後求LCS,時間O(n^2),空間O(n)2. dp[i]存儲A[:i]的LIS,每個i和前面的下標對比,時間O(n^2),空間O(n) for j in [i-1, 0]: if A[j]<A[i]: dp[i] = max(dp[i], dp[j]+1)3. dp[i]存儲LIS為i+1時最大的值,最後len(dp)即為答案,時間O(nlogn),空間O(n) 二分法查找插入dp的位置

最大子序和

最大和包含當前和不包含:sum[i] = max(sum[i-1]+a[i], a[i])

背包問題

https://blog.csdn.net/stack_queue/article/details/53544109

最短路徑

Dijkstra:單源&邊權非負

https://www.jianshu.com/p/ff6db00ad866

Floyd:全源&負環,任意兩點間的最短路徑,時間複雜度為O(N3),空間複雜度為O(N2)

Bellmanford:單源

https://blog.csdn.net/lpjishu/article/details/52413812

Johnson:全源&非負環

股票問題

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/yi-ge-fang-fa-tuan-mie-6-dao-gu-piao-wen-ti-by-l-3/

模式匹配

單模式單匹配:KMP

字符串匹配,返回第一個匹配的位置

https://www.zhihu.com/question/21923021/answer/281346746

大數據

蓄水池抽樣法

選k個,新舊元素被選中第概率都是k/n 第k+1個以k/(k+1)被選中,之前在水池裡的被替換概率為k/(k+1)*1/k=1/(k+1) 則舊元素留下的概率為k/(k+1),與新元素相等。

相關焦點

  • 算法工程師研發技能表
    所以很難有一個一概而論的算法工程師技術棧。比如說做圖像方向的有機器視覺算法崗、做文本方向的有自然語言處理算法崗、做語音的又有語音識別算法崗。本文僅對算法工程師常用的、基礎的、必備的研發技能進行梳理。也就是說,不論你是做哪個業務場景下的算法工作,這些基礎研發技能都是必知必會的。這組技能清單主要包括兩大類型,一類是理論技術,另一類是程式語言和工具類。
  • 前端學習數據結構與算法系列(一):初識數據結構與算法
    前言作為一個對算法沒有任何認知,非科班出身的前端程式設計師,如果想提高自己的能力,不再只寫業務代碼當一個應用工程師,算法是必須掌握的一門本領。算法也是一種思想,當你去讀一些優秀框架的源碼,如果對算法和數據結構一無所知,讀起來很困難,你無法理解人家為什麼要那樣寫,那樣寫的好處是什麼,接下來就跟大家分享下作為一個前端程式設計師,如何學習數據結構與算法。
  • 數據結構和算法 四階段 72 篇總結!
    在所有基本功中,最核心的一定是數據結構與算法。最適用於工程師的算法課,口碑特別好。王爭根據自己研讀數十本算法書籍和多年項目開發的經驗,精選了 20 個最實用數據結構和算法結合具體的軟體開發實例,由淺入深進行講解背後的設計思想,並適時總結一些實用「寶典」,保證你印象深刻,並且能夠迅速對應到實際工作場景中。
  • 微軟、優步,老工程師告訴你哪些數據結構和算法最重要
    一位在 Uber 等科技公司工作過的開發者分享了他的一手經驗,告訴你實際工作中會用到哪些數據結構和算法。日常工作中,你經常使用算法和數據結構嗎?曾就職於 Uber 等科技公司的工程師 Gergely Orosz 提出了這樣一個問題。此外,他也注意到,越來越多的人覺得算法是無用的,並認為它們只是科技公司提出的一種強制性措施罷了。
  • 我們為什麼要學習數據結構和算法?
    對於我們來說,數據結構和算法是那麼熟悉,又是那麼陌生。作為計科院的學生,大學裡都接觸過,但是進入社會以後,我們看起來很少會用到這個。這時候不僅會想到一件問題,學習數據結構和算法真的有用嗎?不學習這個就不能做開發了嗎?在當今的IT行業裡面,有些人不懂數據結構和算法,也能做一輩子的開發,這沒啥毛病,但是兄弟們,開發是開發,那可不是研發啊。
  • 數據結構和算法學習指南
    首先,這裡講的都是普通的數據結構和算法,咱不是搞競賽的,野路子出生,只解決常規的問題,以面試為最終目標。另外,以下是我個人的經驗的總結,沒有哪本算法書會寫這些東西,所以請讀者試著理解我的角度,別糾結於細節問題,因為這篇文章就是對數據結構和算法建立一個框架性的認識。
  • 數據結構與算法?看這篇就夠了!!!
    真正讓程式設計師有區分度,企業招聘萬年不變的重點 —— 算法與數據結構但無論半路出家還是科班出身,除學生時代搞算法競賽的同學外真正用心學習過算法與數據結構太少太少對於後期想要學習算法與數據結構卻不得不面對以下問題:於是我們推出了「數據結構與算法365天特訓營」實時視頻直播
  • 算法與數據結構?看這篇就夠了
    真正讓程式設計師有區分度,企業招聘萬年不變的重點 —— 算法與數據結構但無論半路出家還是科班出身,除學生時代搞算法競賽的同學外真正用心學習過算法與數據結構太少太少對於後期想要學習算法與數據結構卻不得不面對以下問題:於是我們推出了「數據結構與算法365天特訓營」實時視頻直播
  • 算法推薦組:數據平臺(高級)工程師等
    大數據處理/分析(高級)工程師20k-40k 北京 經驗1-3年 本科及以上 全職 職位描述:從海量的用戶行為數據中,發現和驗證用戶行為特徵,提出評估方法,指導算法和產品改進。建設在線實驗平臺,統計分析報表。對數據敏感,崇尚從數據發現問題,提出方案並驗證上線,從而解決產品問題的端到端模式和綜合能力。
  • 《數據結構與算法》十大經典排序算法動圖演示(2019最新Python代碼)
    /JS-Sorting-Algorithm排序算法是《數據結構與算法》中最基本的算法之一。排序算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸併排序、快速排序、堆排序、基數排序等。
  • 阿里技術官丟出的「數據結構與算法」筆記,名不虛傳
    現在隨著科技時代的迅速發展,數據結構與算法已經被更多企業使用以及被更多的人熟知,這也是目前很有前景的一個領域,但是市面上對於數據結構與算法的學習資料還是相對較少,很多人無從下手,那麼該如何學好數據結構與算法呢?現在數據結構與算法也是面試中經常被問及的,難以被忽視的一部分。
  • 數據結構與算法大總結
    數據結構知識綜述一、前言經過一個學期對數據結構與算法的學習,對這門課程有了更深入的了解,了解到了數據結構的相關知識,明白了,數據結構的重要性及應用,回顧一個學期,通過這個小論文,來總結一學期的學習成果,數據結構這門課程,具有一定的深度和廣度,有其複雜性,我們一起來分析一下
  • 資料| 數據結構與算法 JavaScript 描述
    內容簡介 · · · · · ·通過本書的學習,讀者將能自如地選擇最合適的數據結構與算法,並在JavaScript開發中懂得權衡使用。此外,本書也概述了與數據結構與算法相關的JavaScript特性。數組和列表:最常用的數據結構。棧和隊列:與列表類似但更複雜的數據結構。鍊表:如何通過它們克服數組的不足。字典:將數據以鍵-值對的形式存儲。散列:適用於快速查找和檢索。集合:適用於存儲只出現一次的元素。二叉樹:以層級的形式存儲數據。圖和圖算法:網絡建模的理想選擇。
  • 「走過」微軟、優步,老工程師告訴你哪些數據結構和算法最重要
    一位在 Uber 等科技公司工作過的開發者分享了他的一手經驗,告訴你實際工作中會用到哪些數據結構和算法。日常工作中,你經常使用算法和數據結構嗎?曾就職於 Uber 等科技公司的工程師 Gergely Orosz 提出了這樣一個問題。此外,他也注意到,越來越多的人覺得算法是無用的,並認為它們只是科技公司提出的一種強制性措施罷了。
  • 高中數學知識點思維導圖之平面向量、複數、算法初步
    高中數學知識點思維導圖之平面向量、複數、算法初步
  • 算法與算法工程師,技術與技術人員
    (註:標題裡的算法,指機器學習算法,或者說「算法工程師」這個職位名稱裡的「算法」,不是「算法與數據結構」裡的那個算法。誰能告訴我有沒有什麼更好的名字來區別這它們,或許是「機器學習算法」與「傳統算法」?)算法與算法工程師先來一段我在知乎裡回答「做算法工程師是一種怎樣的體驗?」
  • Python數據結構與算法分析
    給定一個問題,計算機科學家的目標是開發一個能夠逐步解決該問題的算法。算法是具有有限步驟的過程,依照這個過程便能解決問題。因此,算法是解決方案。在研究問題解決過程的同時,計算機科學也研究抽象。抽象思維使我們分別從邏輯視角和物理視角來看待問題和解決方案。2、為何學習數據結構及抽象數據類型?過程抽象將功能的實現細節隱藏起來,從而使用戶能從更高的視角來看待功能。
  • JAVA必須掌握的數據結構和算法
    常見的數據結構鍊表LinkedHashSet LinkedList 底層數據結構由鍊表和哈希表組成。數據的添加和刪除都較為方便,就是訪問比較耗費時間。數組ArrayList 訪問數據十分簡單,而添加和刪除數據比較耗工夫堆堆是一種圖的樹形結構,被用於實現「優先隊列",優先隊列是一種數據結構,可以自由添加數據,但取出數據時要從最小值開始按順序取出
  • 從數據結構到算法:圖網絡方法初探
    什麼是圖圖是一種常見的數據結構,用於表示對象及其之間的關係。其中,對象又稱節點(node)或頂點(vertex),關係用邊(edge)來描述。因此也催化出一系列在圖上進行數據挖掘的任務,如為用戶推薦感興趣的好友、判斷蛋白質結構、預測交通流量、檢測異常帳戶等等。但是真實圖的數據量龐大,動輒上億節點、而且內部拓撲結構複雜,很難將傳統的圖分析方法如最短路徑、DFS、BFS、PageRank 等算法應用到這些任務上。鑑於機器學習在圖像、文本領域的廣泛應用,一部分研究者嘗試將機器學習方法和圖數據結合起來,逐漸成為機器學習領域的一股熱潮。
  • 快速入門數據結構和算法
    本文簡要分享算法基礎、常見的數據結構以及排序算法,給同學們帶來一堂數據結構和算法的基礎課。文末福利:阿里雲開發者訓練營來了。一  前言1  為什麼要學習算法和數據結構?2  業務開發要掌握到程度? 二  數據結構基礎1  什麼是數據結構?數據結構是數據的組織、管理和存儲格式,其使用目的是為了高效的訪問和修改數據。數據結構是算法的基石。如果把算法比喻成美麗靈動的舞者,那麼數據結構就是舞者腳下廣闊而堅實的舞臺。2  物理結構和邏輯結構的區別?