最近好多事情,最近前端分享會也如期而至,有幸此次分享會,正好週末有時間,作個總結吧。前端
此次想分享的就是算法與數據結構,刷了一段時間題目,逛了逛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))
複製代碼
對於這部分的算法而言,能夠圍繞從解題思路-->>實現過程-->>代碼實現。 基本上以這三步來實現的話,掌握常見的排序算法完成是沒有問題的。
那麼這部分就暫時梳理到這裏吧。
動態規劃難,能夠說是不少面試者也是我最怕的部分,尤爲是面試的時候,怕面試官考這個算法了。遇到沒有作過的題目,這個時候,可否寫出狀態轉移方程是十分重要的。接下來咱們聊一聊這個專題吧。
首先,強烈推薦我以前分析這個專題如何準備的: 「算法與數據結構」一張腦圖帶你看動態規劃算法之美
若是從點贊角度來看,能夠說,是我寫算法以來,獲得你們確定最多的一次了,能夠看看,不過這裏也會涵蓋部分。
如何學動態規劃,從哪裏入手,應該這麼去作,這麼去刷題,確定是不少初學者一開始就會遇到的問題。
首先,你得了解動態規劃是什麼,它的思想是什麼,定義又是啥。這裏引入維基百科對它的定義:
Wikipedia 定義:它既是一種數學優化的方法,同時也是編程的方法。
固然了,看完這段話,咱們確定對它不瞭解的,咱們能夠翻譯一下,首先它能夠算是一種優化的手段,優化一些重複子問題的操做,將不少重疊子問題經過編程的方式來解決,好比記憶劃搜索。 又好比,若是一個原問題,能夠拆分紅不少子問題,它們之間沒有任何後續性,當前的決策對後續沒有影響的話,每一個子問題的最優解,就能夠組合成原問題的最優解了。
固然了,對於動態規劃每一個人理解是不一樣的,對於應用到具體的場景中,須要咱們都去用多維度的狀態去表述它的含義,這裏也就是狀態轉移方程的含義所在。
嗯,那麼動態規劃解決了什麼問題呢,很顯然,對於重複性問題來講,它能夠很好的解決,那麼從某個維度上來看,它能夠優化一個算法的時間複雜度,也就是一般意義上的,拿空間來換取時間的操做。
動態規劃解題步驟: 這個應該就是實際落地的操做,須要咱們去經過大量的題目來完成,具體咱們須要怎麼作呢?
解題思路,三大步驟👇
「算法與數據結構」一張腦圖帶你看動態規劃算法之美強烈推薦這篇問題,裏面講的很清楚了。
如何高效率刷dp專題:首先,你得找到對應的dp專題,這裏的話,我幫你準備好了,接下來我說一下我是怎麼刷leetcode上面的題目的。
通常而言,刷完中等的leetcode上的dp專題,基本上能夠知足要求了。那麼對於中等的dp題目,不少時候,我是寫不吃來的,那我應該如何去作呢?
還有,我我的建議,刷dp的話,最好從易到難,這樣子本身也會有信心,也不會再去畏懼它。
如下是我收集的部分題目,但願對大家有幫助。
這部分也是尤爲重要的,那麼重點學習深度優先搜索算法(簡稱爲 DFS)和廣度優先搜索算法(簡稱爲 BFS)。
我翻了翻個人博客,剛好有一篇相似的問題,你們能夠看看**「算法與數據結構」DFS和BFS算法之美**。
不過,我看了一下,我當時寫得時候,有點粗糙,不少基本的概念都沒有講明白,因此可能適合一些對這部分有基礎的小夥伴。
在這裏推薦一個有趣的題目:
若是你也遇到過迷宮相似的問題,就能夠考慮搜索算法了,從我我的的角度來講,它的思路其實就是模擬人的思路,每次走到一個路口的時候,我能夠走哪裏,我以前走過的路,怎麼確保,接下來是不能走的,這裏須要在編程的角度,如何去實現呢?
這裏說一說個人經驗,對於剛剛提到的題目而言,我盲猜使用BFS,題目作多了,天然就會有心得,對於BFS和DFS而言,作了兩個相似的題目,會發現,原來搜索算法也是有跡可循,也是存在某些套路的。
給些建議:
一開始可能作的時候,抓不到頭腦,有思路,可是代碼很難寫清楚,那麼如何去作呢? 看題解,瞭解別人的寫法是很不錯的,能夠多個對比,看看哪一份題解代碼是你目前能夠理解的,而後抄下來,看一遍。
最普通的辦法就是:先畫圖,看看思惟上跟實際代碼須要作哪些改變,如何去優化這個過程。最後結合別人代碼,必定不要直接copy,不去思考爲何這麼寫,否則後期發現,是沒有多大效果的,必定要多結合本身的理解。
嗯,不會就看題解,多思考爲何這麼寫!!!
寫到這裏的時候,已經凌晨1點了,算法與數據結構這個方向太大了,一篇文章不可能寫得完,我更但願這篇文章對你,有那麼一點點的幫助,對我,或你都些許有所幫助,那麼它得存在就有那麼一點點意義。
如下是我刷的題集,需者自取,公衆號:前端UpUp,關注它,找我領pdf文檔也能夠。
這個專題想進階,就刷我下面提供的題目吧👇
我以前刷題歷程是根據這套題來的,我以爲裏面題目梯度仍是質量都是很不錯的。
拿到這個pdf有段時間了,因此不清楚具體做者是誰,有侵權的話,可刪。
簡單
中等
簡單
中等
簡單
中等
簡單
中等
困難
簡單
中等
簡單
中等
困難
簡單
中等
困難
簡單
中等
困難
中等
簡單
困難
簡單
中等
困難
簡單
中等
簡單
中等
困難
簡單
中等
簡單
中等
困難
簡單
中等
簡單
中等
困難
若是你以爲這篇內容對你挺有有幫助的話: