「算法與數據結構」你可能須要的一份前端算法總結

前言

最近好多事情,最近前端分享會也如期而至,有幸此次分享會,正好週末有時間,作個總結吧。前端

此次想分享的就是算法與數據結構,刷了一段時間題目,逛了逛LeetCode,看了不少關於這個方面的文章,有所感悟,準備作個記錄吧。node

當你想花時間去了解學習一件對你來講,很苦難的事情的時候,咱們須要明確目標,學習它的意義,它有什麼用,對你有哪方面幫助。面試

升職加薪必備,對之後成長有所幫助,嗯,加薪,加薪,加薪。算法

那麼問題來了,爲何要進大廠呢⬇️編程

年輕時候去大廠的目標,是爲了不,【你得頓悟,是別人的基本功】數組

嗯,閒聊就止步於此,接下來開始吧~安全

站在巨人肩膀上,學起來就很輕鬆了, 這裏我是參考網上的算法刷題路線,能夠參考一下~markdown

公衆號前端UpUp,回覆算法,便可獲取腦圖,以及文末的題目彙總pdf。cookie

算法與數據結構

接下來,咱們就根據這個腦圖來梳理一遍吧~數據結構


數據結構

數據結構能夠說是算法的基石,若是沒有紮實的數據結構基礎,想要把算法學好甚至融會貫通是很是困難的,而優秀的算法又每每取決於你採用哪一種數據結構。學好這個專題也是頗有必要的,那麼咱們能夠稍微的作個分類。

  • 經常使用數據結構

    • 數組,字符串
    • 鏈表
    • 隊列
  • 高級數據結構

    • 前綴樹
    • 線段樹
    • 樹狀數組
    • 主席樹

那麼顯然,最多見的數據結構必定是須要掌握的,對於高級的數據結構而言,若是你有時間,對它有所熱愛的話,能夠深刻了解,好比這個主席樹在解決一些問題 的時候,算法複雜度是log級別的,某些場景下頗有幫助。

這裏想說起的就是。它的結構很顯然是很直觀的,樹固然有不少的性質,這裏也列舉不完,好比面試中常考的樹:

普通二叉樹、平衡二叉樹、徹底二叉樹、二叉搜索樹、四叉樹(Quadtree)、多叉樹(N-ary Tree)。

對於它而言的話,咱們須要到哪些程度呢?

對於常見樹的遍歷,從樹的前序遍歷,到中序遍歷,後續遍歷,以致於層次遍歷,掌握好這四種遍歷的遞歸寫法和非遞歸寫法是很是重要的,接下來須要懂得分析各類寫法的時間複雜度和空間複雜度。

面試準備階段,把樹這個結構花時間去準備的話,對於你理解遞歸仍是頗有幫助的,同時也能幫助你學習一些圖論的知識,更加準確的說,樹是面試考察的熱門考點,尤爲是二叉樹!

掌握好這些數據結構是基礎,絕大部分的算法面試題都得靠它們來幫忙,所以,必定要花功夫勤練題目來深刻理解它們。


排序算法

這應該是面試最常考,最核心的算法。若是你能把排序算法理解的很透徹的話,接下來的其餘算法也是同樣的旁敲側擊。

當時我梳理得是常見的6個排序算法:

在此以前,我也寫過一篇排序算法的文章,我的以爲言簡意賅,能夠看看「算法與數據結構」梳理6大排序算法

有時候,面試官喜歡會問冒泡排序和插入排序,基本上這些都是考察你的基礎知識,而且看看你能不能快速地寫出沒有bug的代碼。

又好比,當面試官問你歸併排序、快速排序和拓撲排序等的時候,這個時候考察的是你平時對算法得積累,因此有必要作個總結。

咱們拿歸併排序來舉例子,咱們應該如何表達清楚呢?首先,咱們應該把這個它的思路說清楚:

歸併排序的核心思想就是分治,它將一個複雜的問題分紅兩個或者多個相同或類似的子問題,而後把子問題分紅更小的子問題,直到子問題能夠簡單的直接求解,最原問題的解就是子問題解的合併。歸併排序將分治的思想體現得淋漓盡致。

當你向面試官理清楚這個思路時,面試官內心就有底了,他會想,嘿,這個小夥子不錯!那你接下來都有底氣了!

有了思想,那麼實現起來就不難了:

一開始先把數組從中間劃分紅兩個子數組,一直遞歸地把子數組劃分紅更小的子數組,直到子數組裏面只有一個元素,纔開始排序。

排序的方法就是按照大小順序合併兩個元素,接着依次按照遞歸的返回順序,不斷地合併排好序的子數組,直到最後把整個數組的順序排好。

貼一份以前的代碼:

const merge = (left, right) => { // 合併數組

    let result = []
    // 使用shift()方法偷個懶,刪除第一個元素,而且返回該值
    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            result.push(left.shift())
        } else {
            result.push(right.shift())
        }
    }
    while (left.length) {
        result.push(left.shift())
    }

    while (right.length) {
        result.push(right.shift())
    }
    return result
}

let mergeSort = function (arr) {
    if (arr.length <= 1)
        return arr
    let mid = Math.floor(arr.length / 2)
    // 拆分數組
    let left = arr.slice(0, mid),
        right = arr.slice(mid);
    let mergeLeftArray = mergeSort(left),
        mergeRightArray = mergeSort(right)
    return merge(mergeLeftArray, mergeRightArray)
}

// let arr = [2, 9, 6, 7, 4, 3, 1, 7, 0, -1, -2]
// console.log(mergeSort(arr))
複製代碼

對於這部分的算法而言,能夠圍繞從解題思路-->>實現過程-->>代碼實現。 基本上以這三步來實現的話,掌握常見的排序算法完成是沒有問題的。

那麼這部分就暫時梳理到這裏吧。


動態規劃

動態規劃難,能夠說是不少面試者也是我最怕的部分,尤爲是面試的時候,怕面試官考這個算法了。遇到沒有作過的題目,這個時候,可否寫出狀態轉移方程是十分重要的。接下來咱們聊一聊這個專題吧。

首先,強烈推薦我以前分析這個專題如何準備的: 「算法與數據結構」一張腦圖帶你看動態規劃算法之美

若是從點贊角度來看,能夠說,是我寫算法以來,獲得你們確定最多的一次了,能夠看看,不過這裏也會涵蓋部分。

如何學動態規劃,從哪裏入手,應該這麼去作,這麼去刷題,確定是不少初學者一開始就會遇到的問題。

  • 概念
  • 動態規劃解決了什麼問題
  • 動態規劃解題的步驟
  • 如何高效率刷dp專題

首先,你得了解動態規劃是什麼,它的思想是什麼,定義又是啥。這裏引入維基百科對它的定義:

Wikipedia 定義:它既是一種數學優化的方法,同時也是編程的方法。

固然了,看完這段話,咱們確定對它不瞭解的,咱們能夠翻譯一下,首先它能夠算是一種優化的手段,優化一些重複子問題的操做,將不少重疊子問題經過編程的方式來解決,好比記憶劃搜索。 又好比,若是一個原問題,能夠拆分紅不少子問題,它們之間沒有任何後續性,當前的決策對後續沒有影響的話,每一個子問題的最優解,就能夠組合成原問題的最優解了。

固然了,對於動態規劃每一個人理解是不一樣的,對於應用到具體的場景中,須要咱們都去用多維度的狀態去表述它的含義,這裏也就是狀態轉移方程的含義所在。

嗯,那麼動態規劃解決了什麼問題呢,很顯然,對於重複性問題來講,它能夠很好的解決,那麼從某個維度上來看,它能夠優化一個算法的時間複雜度,也就是一般意義上的,拿空間來換取時間的操做。

動態規劃解題步驟: 這個應該就是實際落地的操做,須要咱們去經過大量的題目來完成,具體咱們須要怎麼作呢?

解題思路,三大步驟👇

  1. 狀態定義
  2. 列出狀態轉移方程
  3. 初始化狀態

「算法與數據結構」一張腦圖帶你看動態規劃算法之美強烈推薦這篇問題,裏面講的很清楚了。

如何高效率刷dp專題:首先,你得找到對應的dp專題,這裏的話,我幫你準備好了,接下來我說一下我是怎麼刷leetcode上面的題目的。

通常而言,刷完中等的leetcode上的dp專題,基本上能夠知足要求了。那麼對於中等的dp題目,不少時候,我是寫不吃來的,那我應該如何去作呢?

  • 首先,我先看題解,把它的狀態轉移方程寫下來,仔細的品味一下,它這麼定義,解決了我以前的什麼難點,爲啥我是沒有想到的。
  • 而後,看完以後,嘗試按照這個題解思路,我本身能不能單獨實現呢?
  • 若是不能的話,就照着它的代碼,寫一遍,多看看狀態轉移方程是如何寫的,把這個題目收藏起來。
  • 等到下次,或者是隔天,再來看一遍題目,而後看看能不能單獨完成,若是不能,第三天再這麼操做。

還有,我我的建議,刷dp的話,最好從易到難,這樣子本身也會有信心,也不會再去畏懼它。

進階題目彙總

如下是我收集的部分題目,但願對大家有幫助。

簡單


中等


困難


搜索算法

這部分也是尤爲重要的,那麼重點學習深度優先搜索算法(簡稱爲 DFS)和廣度優先搜索算法(簡稱爲 BFS)。

我翻了翻個人博客,剛好有一篇相似的問題,你們能夠看看**「算法與數據結構」DFS和BFS算法之美**。

不過,我看了一下,我當時寫得時候,有點粗糙,不少基本的概念都沒有講明白,因此可能適合一些對這部分有基礎的小夥伴。

在這裏推薦一個有趣的題目:

穿過迷宮的最少移動次數

若是你也遇到過迷宮相似的問題,就能夠考慮搜索算法了,從我我的的角度來講,它的思路其實就是模擬人的思路,每次走到一個路口的時候,我能夠走哪裏,我以前走過的路,怎麼確保,接下來是不能走的,這裏須要在編程的角度,如何去實現呢?

這裏說一說個人經驗,對於剛剛提到的題目而言,我盲猜使用BFS,題目作多了,天然就會有心得,對於BFS和DFS而言,作了兩個相似的題目,會發現,原來搜索算法也是有跡可循,也是存在某些套路的。

給些建議:

一開始可能作的時候,抓不到頭腦,有思路,可是代碼很難寫清楚,那麼如何去作呢? 看題解,瞭解別人的寫法是很不錯的,能夠多個對比,看看哪一份題解代碼是你目前能夠理解的,而後抄下來,看一遍。

最普通的辦法就是:先畫圖,看看思惟上跟實際代碼須要作哪些改變,如何去優化這個過程。最後結合別人代碼,必定不要直接copy,不去思考爲何這麼寫,否則後期發現,是沒有多大效果的,必定要多結合本身的理解。

嗯,不會就看題解,多思考爲何這麼寫!!!


寫到這裏的時候,已經凌晨1點了,算法與數據結構這個方向太大了,一篇文章不可能寫得完,我更但願這篇文章對你,有那麼一點點的幫助,對我,或你都些許有所幫助,那麼它得存在就有那麼一點點意義。

如下是我刷的題集,需者自取,公衆號:前端UpUp,關注它,找我領pdf文檔也能夠。

進階題目彙總

這個專題想進階,就刷我下面提供的題目吧👇

DFS

BFS


題目彙總

我以前刷題歷程是根據這套題來的,我以爲裏面題目梯度仍是質量都是很不錯的。

拿到這個pdf有段時間了,因此不清楚具體做者是誰,有侵權的話,可刪。

數組&鏈表

簡單

中等

Map & Set

簡單

中等

堆棧&隊列

簡單

中等

二分查找

簡單

中等

困難

遞歸

簡單

中等

哈希表

簡單

中等

困難

二叉樹

簡單

中等

困難

二叉搜索樹

簡單

中等

困難

中等

堆和排序

簡單

困難

DFS

簡單

中等

困難

BFS

簡單

中等

Trie樹

簡單

中等

困難

分治算法

簡單

中等

回溯算法

簡單

中等

困難

貪心算法

簡單

中等

動態規劃

簡單

中等

困難


❤️ 感謝你們

若是你以爲這篇內容對你挺有有幫助的話:

  1. 點贊支持下吧,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
  2. 關注公衆號前端UpUp,聯繫做者👉 DayDay2021 ,咱們一塊兒學習一塊兒進步。
  3. 以爲不錯的話,也能夠閱讀TianTian近期梳理的文章(感謝掘友的鼓勵與支持🌹🌹🌹):
相關文章
相關標籤/搜索