資料結構:
1、陣列 雜湊表 棧 佇列 鍊錶 樹 圖等等的定義
2、資料結構的遍歷:
a)陣列
通過下標就可以遍歷;
常見題目:
1)陣列下標是0到n-1的數字,如果陣列元素是0到n-1的數字的時,這種題目經常會構成閉環,以元素作為下標之類。比如0到n中重複的元素,100死囚犯問題等等。
2)陣列遍歷方向問題:
有時候從頭到尾(任何題目第一印象都是從頭到尾)
有時候從尾到頭(二維陣列題目:直角座標系第一象限有n個點,找出滿足以下情況的所有點:該點不存在比它橫座標大且比他縱座標大的點)
有時候從兩邊到中間(快排之類的題目,都是 while(i!=j){i++,j--})
有時候從中間到兩邊(leetcode 接雨水)
3)其他:
純陣列題目不多,dp問題經常要用到陣列,不過就是乙個套路
b)棧
棧就不說遍歷了,棧主要是彈出進入順序的不同,出棧順序就有不同,入棧的12345678到n,出棧後順序就會發生改變,但是棧有個特性,非入即出,如果入棧不可行,那麼一定是出棧,如果出棧不可行,那繼續入棧。
經典題目,可能的出棧順序,正確的括號,正確的括號高階版(大中小括號),去除字串中所有連續的ab,caaabbbcab就變成cc這樣
高階:兩個棧實現排序(猿輔導三面問我舍友的),還有好多一時想不起來
c)鍊錶(單向)
鍊錶遍歷就很簡單,沒有下標,只有指標,只能看到下一位。
鍊錶的題目就很多,用鍊錶實現排序(遞迴的merge),merge(兩有序鍊錶的合併),y型鍊錶(兩個head)找交點或判斷兩個head到null的長度,b型鍊錶(乙個head,但是尾巴沒有null,尾巴指向鍊錶中的某元素)找交點或判斷環長
d)佇列
佇列能出的題,主要關注點在於入隊和出隊的時機,和棧很像,經常用在樹的層遍歷上。問的不多(主要是我感覺比棧的難一點),題目也經常和陣列結合,連續的陣列,找某一段(和最大的值)之類,太久不敲,忘了
e)樹
最重要的就是樹,主要是用的很多,資料庫裡b樹b+樹,封裝的標準庫里的紅黑樹。
最基礎就是二叉樹,乙個左乙個右,沒有左就看右,都沒有就return
單純出題遍歷的,忽略null節點的話,根據前中找後,根據後中找前,沒有前後找中的
有null節點,前中後都有可能,比較複雜建議放棄
層序遍歷:用佇列,迴圈,可以不用遞迴
樹最重要的就是遞迴三遍歷,不遞迴則用棧,不遞迴的可以看看,我感覺了解就行,遞迴的目的找到 左中右三個節點的關係,隨後利用遍歷順序的不同解決問題,如後序遍歷(eg.葉節點的最遠距離)由於葉子一定共用某乙個祖先,這時候,左右分支處理完了,我才能知道我當前中間節點的子葉節點的最遠距離,因此採用後序遍歷. 遞迴函式本體一定是處理root的,順序很重要,碰到樹,第一時間判斷遍歷方式
前中後序遍歷以及層序遍歷,出題都很多。 但是套路也都是一樣的,找距離,找節點。
樹的插入查詢
這個也很重要,主要樹就是幹這個的,紅黑樹的插入查詢可以了解一下,其中樹的旋轉操作很重要,建議背熟,但是紅黑樹的插入刪除都挺麻煩的,可以了解。普通二叉樹插入查詢很簡單,但是容易不平衡,比如按順序插入,1234567,就變成了乙個鍊錶形狀,樹的logn特性就退化成n了,紅黑樹就可以避免這種情況。
多叉樹:要會寫多叉樹的treenode;字首樹問的比較多,就是查字典。leetcode5.17號周賽出了一道題,多叉樹的節點上可能有蘋果,從root出發撿完所有蘋果需要多少步,和二叉樹差不多,就是後續遍歷解決問題。
樹的題目太多了,一時間總結不了,部落格裡好像也有些題目是樹的,記不清了。
圖:
圖很重要,問的很少,主要是比較難,但是圖,如果走過的節點不會重複走的話,就可以看成樹,只要是樹就避免不了深度優先和廣度優先遍歷。深度就是前中後,廣度就是層序遍歷。dfs很常用。問題就是如何保證走過的節點不會重複,就是使用標記,標記走過的節點即可。由此圖有一堆特定的名稱的遍歷演算法。可以看看大話資料結構,但是我最常見的題目就是給個二維陣列當圖,呼叫dfs什麼的。
圖還分有向圖無向圖,建議只了解。還有標記圖中節點的鄰接表鄰接矩陣,很煩,可以不看基本不問。
雜湊表:
lru中有用。未完待續
演算法思想:
貪心dp之類高階的名詞(沒卵用) 貪心就是給你一堆金子,金子大小不一樣,讓你挑n次,一次挑乙個,貪心就是每次都挑最大的,顯然不是最優演算法,(可以用堆,可以用快排),但是有時候貪心就是最優的解(參考leetcode跳躍遊戲2)。
dp就是動態規劃,斐波那契數列 fn=fn-1+fn-2。這就是dp,就是把已有的知識總結一下得到未有的知識。一般面試出的題,第一時間想不到什麼做法,那就是dp(找出01矩陣中,最大的全1矩陣的面積,還有一堆湊錢問題(左神的書)),dp大部分時候需要用到多維陣列,二維的比較多,類似於斐波那契數列,當前點只與前一行或者前一點或者前一行以及前一點有關,所以空複雜度可以降到o(n)甚至o(1).
約束條件太多的dp問題,面試一定不會讓你寫,說個思想,把每個軸說清楚就可以,但是二維的dp很有可能會要寫,這時候建議能降空間就降。
演算法複雜度分析
遍歷很重要,遍歷一次算1,n次算n,通常題目給到陣列大小為1-10000就是要求用on或者o1的演算法,找第n個斐波那契數,用遞迴:時間on空間on,用迴圈,時間on空間o1,用公式,時間o1空間o1。
如果面試某個題目on2的複雜度很簡單很容易想出來,那麼一定有on或者ologn的做法
如:leetcode238 除自身以外陣列的乘積c++ ,不使用除法,就得犧牲空間複雜度。
我的例題大多都有空間時間複雜度分析,並沒有很玄幻。
演算法常見資料結構
array 陣列最簡單而且應用最廣泛的資料結構之一.特性 使用連續的記憶體來儲存,陣列中的所有元素必須是相同的型別或型別的衍生 同質資料結構 元素可以通過下標直接訪問 linkedlist 鍊錶,線性表的一種,最基本,最簡單,也最為常用的資料結構.特性 元素之間的關係是一對一的關係 除了第乙個和最後...
資料結構和常見演算法
資料結構中常用的操作的效率表 通用資料結構 查詢 插入 刪除遍歷 陣列o n o n o n 有序陣列 o logn o n o n o n 鍊錶o n o 1 o n 有序鍊錶 o n o n o n o n 二叉樹o logn o logn o logn o n 二叉樹 最壞 o n o n o...
資料結構與演算法 常見的資料結構整合
資料結構是指互相之間存在一種或多種特定短息的資料與元素的集合。陣列是由型別相同的元素構成的有序集合。陣列分類 一維陣列 二維陣列 多維陣列 二維陣列和稀疏陣列互相轉化 陣列中的重複數字 二維陣列中的查詢 最小的k個數 棧是限定僅在表尾部進行插入和刪除操作的線性表。相關問題集錦 棧實現綜合計算器 中綴...