一 緒論
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的陣列,經過整理後變成,要求時間複雜度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演算法又稱為插點法,是一種用於尋找給定的加權圖中多源點之間最短路徑的演算法。該演算法名稱以創始人之一、2023年圖靈獎獲得者羅伯特·弗洛伊德命名
8 帶負權的最短路徑bellman-ford演算法
9 最小生成樹mst:最小生成樹要求從乙個帶權無向完全圖中選擇n-1條邊並使這個圖仍然連通(也即得到了一棵生成樹),同時還要考慮使樹的權最小。最小生成樹最著名演算法是prim演算法和kruskal演算法
最常見的兩種演算法:
prim演算法 kruskal演算法
9 拓撲排序
七 貪心法與動態規劃
經典排序演算法總結
排序演算法是離散數學和資料結構學科最基本的演算法,雖然知道這些排序演算法的名字,但是一直沒有研究過它們的實現原理。現在把它們收集起來,並一一親自實現,來加深對排序演算法的理解。1,氣泡排序 最簡單的排序演算法,從第乙個元素開始比較相鄰元素大小,如果前邊元素大於後邊元素則交換位置,否則將下標移到下乙個...
經典排序演算法總結
插入排序 選擇排序 歸併排序 排序方法 平均情況 最好最差 空間複雜度 穩定性氣泡排序o n2 o n 2 o n o n o n2 o n 2 o 1 o 1 穩定快速排序o nlogn o nlog n o nlogn o nlog n o n2 o n 2 o nlogn o nlog n 不...
各種經典演算法總結
二分排序 二分查詢 演算法思想 1 將陣列排序 從小到大 2 每次跟中間的數mid比較,如果相等可以直接返回,如果比mid大則繼續查詢大的一邊,否則繼續查詢小的一邊。輸入 排序好的陣列 ssource,陣列大小 array size,查詢的值 key 返回 找到返回相應的位置,否則返回 1 int ...