labuladong 的算法秘籍-讀書筆記-學(xué)習(xí)算法和刷題的框架思維
一、數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)方式
數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)方式只有兩種:數(shù)組(順序存儲(chǔ))和鏈表(鏈?zhǔn)酱鎯?chǔ))。
所有的數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)都是數(shù)組或者鏈表
數(shù)組
優(yōu)點(diǎn)
因?yàn)榇鎯?chǔ)空間是連續(xù)的,所以查找方便
缺點(diǎn)
但是要插入或者刪除中間元素,需要移動(dòng)后續(xù)所有的元素,所以插入刪除比較麻煩
并且擴(kuò)容的時(shí)候需要將舊數(shù)組數(shù)據(jù)遷移到新數(shù)組,也比較麻煩
鏈表
優(yōu)點(diǎn)
與數(shù)組相反,鏈表的插入刪除很方便,只需要修改指向的指針即可,擴(kuò)容時(shí),修改最后一個(gè)元素的指針指向新地址。
缺點(diǎn)
因?yàn)榇鎯?chǔ)空間不連續(xù),所以查找元素,需要一個(gè)個(gè)元素遍歷找,不能隨機(jī)訪問。并且需要存儲(chǔ)前后元素地址,消耗更多存儲(chǔ)空間。
二、數(shù)據(jù)結(jié)構(gòu)的基本操作
遍歷+訪問 增刪改查
各種數(shù)據(jù)結(jié)構(gòu)的遍歷 + 訪問無非兩種形式:線性的和非線性的
線性就是 for/while 迭代為代表,非線性就是遞歸為代表。
所有數(shù)據(jù)結(jié)構(gòu)的遍歷基本都是由for/while或者遞歸或者他們的組合實(shí)現(xiàn)的
三、算法刷題指南
數(shù)據(jù)結(jié)構(gòu)是工具,算法是通過合適的工具解決特定問題的方法。
作者建議的刷題順序
1、先學(xué)習(xí)像數(shù)組、鏈表這種基本數(shù)據(jù)結(jié)構(gòu)的常用算法,比如單鏈表翻轉(zhuǎn),前綴和數(shù)組,二分搜索等。
2、學(xué)會(huì)基礎(chǔ)算法之后,不要急著上來就刷回溯算法、動(dòng)態(tài)規(guī)劃這類筆試??碱},而應(yīng)該先刷二叉樹,先刷二叉樹,先刷二叉樹
因?yàn)槎鏄涫亲钊菀?strong>培養(yǎng)框架思維的,而且大部分算法技巧,本質(zhì)上都是樹的遍歷問題。
綜上,對(duì)于畏懼算法的同學(xué)來說,可以先刷樹的相關(guān)題目,試著從框架上看問題,而不要糾結(jié)于細(xì)節(jié)問題。