經典算法題目及思路解法總結

一 緒論

1 最大連續子數組:給定一個數組,求它的連續子數組,使得該子數組的和最大
解法:
(1)暴力法
(2)分治法
(3)分析法
(3)動態規劃法

2 查找旋轉數組的最小值

3 零子數組

4 LCS(最長公共子序列):兩個序列X和Y的公共子序列中,長度最長的那個,定義爲X和Y的最長公共子序列
LCS可以描述兩段文字之間的“相似度”
解法:
(1)窮舉法
(2)動態規劃法

5 LCS的應用:最長遞增子序列LIS:給定一個長度爲N的數組,找出一個最長的單調遞增子序列
解法:
(1)使用LCS解LIS
(2)動態規劃方法

二 字符串

1 字符串循環左移:給定一個給定一個字符串,要求把S的前k個字符移動到S的尾部,如把字符串“abcdef”前面的2個字符‘a’‘b’移動到字符串的尾部,得到新字符串“cdefab”
解法:
(1)暴力移位法
(2)(X’Y’) = YX

2 字符串的全排列:給定字符串S[0…N-1],設計算法,枚舉S的全排列

3 KMP算法:KMP算法是一種線性時間複雜度的字符串匹配算法,它是對BF(暴力求解)算法的改進

4 DFA和NFA:以當前位置爲DFA的狀態,以模式串的字符爲DFA的轉移條件,建立確定有窮自動機

DFA的五要素:
非空有限的狀態集合Q
 輸入字母表Σ
 轉移函數δ
 開始狀態S
 結束狀態F

5 KMP應用:PowerString問題:給定一個長度爲n的字符串S,如果存在一個字符串T,重複若干次T能夠得到S,那麼,S叫做週期串,T叫做S的一個週期。如:字符串abababab是週期串,abab、ab都是它的週期,其中,ab是它的最小週期。設計一個算法,計算S的最小週期。如果S不存在週期,返回空串

6 求字符串的最長迴文子串:該算法的要求,是求字符串中最長的那個迴文子串

7 Manacher算法和BM算法

三 數組

1 尋找和爲定值的兩個數:輸入一個數組A[0…N-1]和一個數字Sum,在數組中查找兩個數Ai,Aj,使得Ai+Aj=Sum
解法:
(1)暴力法
(2)利用Hash結構求解

2 Hash函數:Hash函數在Hash結構設計中居於核心地位。一個好的Hash函數,能夠將數據映射到“雜亂”的位置

三個經典Hash函數:
 dbj2
 sdbm
 MurmurHash

3 分支限界法

4 荷蘭國旗問題:現有紅、白、藍三個不同顏色的小球,亂序排列在一起,請重新排列這些小球,使得紅白藍三色的同顏色的球在一起。這個問題之所以叫荷蘭國旗,是因爲我們可以將紅白藍三色小球想象成條狀物,有序排列後正好組成荷蘭國旗
在這裏插入圖片描述

5 完美洗牌算法:長度爲2n的數組{a1,a2,a3,…,an,b1,b2,b3,…,bn},經過整理後變成{a1,b1,a2,b2,…,an,bn},要求時間複雜度O(n),空間複雜度O(1)

四 樹

1 二叉查找樹:二叉查找樹(二叉搜索樹)是滿足以下條件的二叉樹

 左子樹上的所有節點值均小於根節點值

 右子樹上的所有節點值均不小於根節點值

 左右子樹也滿足上述兩個條件

二叉樹的遍歷:

前序遍歷:  訪問根節點  前序遍歷左子樹  前序遍歷右子樹

中序遍歷:  中序遍歷左子樹  訪問根節點  中序遍歷右子樹

後序遍歷:  後序遍歷左子樹  後序遍歷右子樹  訪問根節點

2 平衡二叉樹:平衡二叉樹要求對於每一個節點來說,它的左右子樹的高度之差不能超過1,如果插入或者刪除一個節點使得高度之差大於1,就要進行節點之間的旋轉,將二叉樹重新維持在一個平衡狀態

3 2-3-4樹和B樹

五 鏈表、棧與遞歸

1 鏈表相加:給定兩個鏈表,分別表示兩個非負整數。它們的數字逆序存儲在鏈表中,且每個結點只存儲一個數字,計算兩個數的和,並且返回和的鏈表頭指針

2 鏈表的部分翻轉:給定一個鏈表,翻轉該鏈表從m到n的位置。要求直接翻轉而非申請新空間

3 鏈表劃分:給定一個鏈表和一個值x,將鏈表劃分成兩部分,使得劃分後小於x的結點在前,大於等於x的結點在後。在這兩部分中要保持原鏈表中的出現順序

4 排序鏈表中去重:給定排序的鏈表,刪除重複元素,只保留重複元素第一次出現的結點

5 由LCA引出指針和遞歸問題:最近公共祖先(Lowest Common Ancestor,LCA):給定一棵樹 T 和兩個結點 u 和 v,找出 u 和 v 離根結點最遠的公共祖先

6 單鏈公共結點問題

7 括號匹配:給定字符串,僅由"()[]{}"六個字符組成。設計算法,判斷該字符串是否有效

 括號必須以正確的順序配對,如:"()"、"()[]" 是有效的,但"([)]"無效

8 最長括號匹配:給定字符串,僅包含左括號’(‘和右括號’)’,它可能不是括號匹配的,設計算法,找出最長匹配的括號子串,返回該子串的長度。如:"(()":2,"(()())":6

9 逆波蘭表達式RPN

10 直方圖矩形面積:給定n個非負整數,表示直方圖的方柱的高度,同時,每個方柱的寬度假定都爲1;試找出直方圖中最大的矩形面積。如:給定高度爲:2,1,5,6,2,3,最大面積爲10
在這裏插入圖片描述
11 另一個直方圖例題:收集雨水問題:給定n個非負整數,表示直方圖的方柱的高度,同時,每個方柱的寬度假定都爲1。若使用這樣形狀的容器收集雨水,可以盛多少水量

 如輸入:0,1,0,2,1,0,1,3,2,1,2,1 返回6
在這裏插入圖片描述

六 圖論

1 圖的遍歷和搜索-廣度優先遍歷BFS

2 單詞變換問題:給定字典和一個起點單詞、一個終點單詞,每次只能變換一個字母,問從起點單詞是否可以到達終點單詞?最短多少步?

3 圖的遍歷和搜索-深度優先搜索DFS

4 八皇后問題:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種解法
在這裏插入圖片描述
5 LCA-Tarjan算法

6 最短路徑SPF

7 Floyd算法:Floyd算法又稱爲插點法,是一種用於尋找給定的加權圖中多源點之間最短路徑的算法。該算法名稱以創始人之一、1978年圖靈獎獲得者羅伯特·弗洛伊德命名

8 帶負權的最短路徑Bellman-ford算法

9 最小生成樹MST:最小生成樹要求從一個帶權無向完全圖中選擇n-1條邊並使這個圖仍然連通(也即得到了一棵生成樹),同時還要考慮使樹的權最小。最小生成樹最著名算法是Prim算法和Kruskal算法

最常見的兩種算法:
 Prim算法  Kruskal算法

9 拓撲排序

七 貪心法與動態規劃

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