●第1章初步認識算法思想
1.1什麼是算法1
1.1.1一道趣味題1
1.1.2算法的定義2
1.1.3計算機中的算法2
1.1.4總結算法的特征3
1.2算法是程序的靈魂3
1.3算法的表示方法4
1.3.1用流程圖來表示算法4
1.3.2用N-S流程圖來表示算法5
1.4Python算法思想6
1.4.1常用的算法思想6
1.4.2衡量算法優劣的標準6
1.4.3算法復雜度7
1.4.4時間復雜度與空間復雜度的取舍問題9
1.5小結10
第2章枚舉算法思想
2.1枚舉算法基礎11
2.1.1枚舉算法介紹11
2.1.2Python中枚舉算法的實現思路11
2.2算法演練——找出符合條件的5位數12
2.2.1算法分析:首位數不能是誰12
2.2.2具體實現12
2.3算法演練——24點遊戲13
2.3.1算法分析:加括號和去除重復表達式13
2.3.2具體實現14
2.3.3第二種方案:列表切片操作實現排列組合17
2.3.4第三種方案:itertools模塊實現排列組合17
2.4算法演練——解決熄燈問題19
2.4.1算法分析:規則中的規律20
2.4.2具體實現21
2.5算法演練——解決“討厭的青蛙”問題23
2.5.1算法分析:縮小解的空間24
2.5.2具體實現24
2.6小結26
第3章遞歸算法思想
3.1遞歸算法思想基礎27
3.2算法演練——解決“斐波那契數列”問題28
3.2.1算法分析:找出兔子增加的規律28
3.2.2具體實現28
3.3算法演練——解決“漢諾塔”問題29
3.3.1算法分析:情景模擬移動過程29
3.3.2具體實現30
3.4算法演練——解決“階乘”問題32
3.4.1算法分析:拆分調用32
3.4.2具體實現:顯示6以內階乘過程32
3.5算法演練——進制轉換器33
3.5.1算法分析:除以2獲取餘數33
3.5.2具體實現:輸出十進制數字10對應的二進制數33
3.6算法演練——分解數字34
3.6.1算法分析:遞歸除以1034
3.6.2具體實現:分解5位整數1234534
3.7算法演練——解決二叉樹遍歷問題34
3.7.1算法分析:實現三種遍歷方式34
3.7.2實現樹的結構35
3.7.3二叉樹遞歸遍歷方案36
3.8算法演練——優選公約數和最小公倍數38
3.8.1算法分析:整理計算流程38
3.8.2基於遞歸算法的方案38
3.8.3比較遞歸和非遞歸方案39
3.9小結40
第4章分治算法思想
4.1分治算法思想基礎41
4.1.1分治算法介紹與解題步驟41
4.1.2分治算法的思路41
4.1.3分治算法能解決什麼類型的問題42
4.2算法演練——二分法找出有序列表指定值43
4.2.1算法分析:確定中位數43
4.2.2第一種方案:先判斷再查詢43
4.2.3第二種方案:判素是否在列表中44
4.2.4第三種方案:找出有序列表中的指定值45
4.3算法演練——求順序表中數據的優選值45
4.3.1算法分析:找出每一個分組中的優選值45
4.3.2具體實現:找出給定列表list中的優選值46
4.4算法演練——查找素的最小值和優選值46
4.4.1算法分析:合理分組46
4.4.2第一種方案:分組計算47
4.4.3第二種方案:選擇優素48
4.5算法演練——找出一組序列中的第k小(素48
4.5.1算法分析:設素48
4.5.2第一種方案:分組比較49
4.5.3第二種方案:快速排序的分治算法49
4.5.4第三種方案:分組和排序同時進行50
4.5.5第四種方案:生成隨機校驗碼51
4.6算法演練——快速排序51
4.6.1算法分析:設定基準線並對比51
4.6.2具體實現52
4.6.3第二種方案:列表推導52
4.7算法演練——實現歸並排序53
4.7.1算法分析:中間下標與值大小分配53
4.7.2具體實現:對列表[1,6,12,3,8]進行歸並排序54
4.8算法演練——整數劃分54
4.8.1算法分析:梳理遞歸關繫55
4.8.2具體實現55
4.9小結56
第5章貪心算法思想
5.1貪心算法思想基礎57
5.1.1貪心算法介紹57
5.1.2貪心算法的基本思路58
5.2算法演練——解決“找零方案”問題58
5.2.1算法分析:零錢的面額是固定的58
5.2.2具體實現58
5.3算法演練——解決“汽車加油”問題59
5.3.1算法分析:先加油後貪心59
5.3.2具體實現59
5.4算法演練——解決“求素之和問題”問題60
5.4.1算法分析:確定素的和是否優選60
5.4.2具體實現:計算整數列表s的優選素之和61
5.5算法演練——解決“幼兒園分糖果”問題61
5.5.1算法分析:優先從需求因子小的孩子進行嘗試61
5.5.2具體實現61
5.6算法演練——聖誕節的禮物62
5.6.1算法分析:單位價值優選62
5.6.2具體實現63
5.7算法演練——解決“活動安排”問題64
5.7.1算法分析:活動安排問題的很優解64
5.7.2第一個方案:快速排序65
5.7.3第二個方案:通過冒泡排序同步交換數據66
5.8算法演練——解決“搖擺序列”問題67
5.8.1算法分析:選擇使得搖擺子序列長度更長的數67
5.8.2具體實現68
5.9算法演練——移除k個數字69
5.9.1算法分析:從高位向低位遍歷69
5.9.2具體實現70
5.10算法演練——四種解決“霍夫曼編碼”問題的方案70
5.10.1算法分析71
5.10.2第一種方案:權值排序72
5.10.3第二種方案:使用Python自帶的內置庫heapq73
5.10.4第三種方案:使用內置統計函數75
5.10.5第四種方案:實現完整樹的隊列操作76
5.11算法演練——解決“Kruskal算法”問題78
5.11.1算法分析:順序選取權重邊79
5.11.2第一種方案:判斷根結點是否相同80
5.11.3第二種方案:將權重最小的邊加入到最小生成樹81
5.11.4第三種方案:基於不相交集實現83
5.12算法演練——解決“Prim算法”問題85
5.12.1算法分析:將結點分組86
5.12.2第一種方案:選取權重最小的一條邊86
5.12.3第二種方案:隨機選取結點87
5.13小結89
……