數據結構以及常見算法

數據結構:

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++ ,不使用除法,就得犧牲空間複雜度。

我的例題大多都有空間時間複雜度分析,並沒有很玄幻。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章