(十二)算法设计思想之“分而治之”
算法設計思想之“分而治之”
- 分而治之是是什么
- 場景一:歸并排序
- 場景二:快速排序
- LeetCode:374.猜數字大小
- LeetCode:226.翻轉二叉樹
- LeetCode:100.相同的樹
- LeetCode:101.對稱二叉樹
- 思考題
分而治之是是什么
分而治之是算法設計中的一種方法
它將一個問題分成多個和原問題相似的小問題,遞歸解決小問題,再將結果合并以解決原來的問題
應用場景:歸并排序、快速排序、二分搜索、翻轉二叉樹…
場景一:歸并排序
分:把數組從中間一分為二
解:遞歸地對兩個子數組進行歸并排序
合:合并有序子數組
場景二:快速排序
分:選基準,按基準把數組分成兩個子數組
解:遞歸地對兩個子數組進行快速排序
合:對兩個子數組進行合并
LeetCode:374.猜數字大小
解題思路
二分搜索,同樣具備“分、解、合”的特性
考慮選擇分而治之
解題步驟
分:計算中間元素,分割數組
解:遞歸地在較大或者較小子組件進行二分搜索
合:不需要此步,因為在子數組中搜到就返回了
時間復雜度O(logn),空間復雜度是O(logn)
LeetCode:226.翻轉二叉樹
解題思路
先翻轉左右子樹,再將子樹換個位置
符合“分、解、合”特性
考慮選擇分而治之
解題步驟
分:獲取左右子樹
解:遞歸地翻轉左右子樹
合:將翻轉后的左右子樹換個位置放在根節點上
時間復雜度O(n),n是樹的節點數,空O(樹的高度),最壞的情況是O(n)
LeetCode:100.相同的樹
解題思路
兩個樹:根節點的值相同,左子樹相同,右子樹相同
符合“分、解、合”特性
考慮選擇分而治之
解題步驟
分:獲取兩個樹的左子樹和右子樹
解:遞歸地判斷兩個樹的左子樹是否相同,右子樹是否相同
合:將上述結果合并,如果根節點的值也相同,樹就相同
時間復雜度O(n),n是樹的節點數,空間復雜度最壞情況是O(n),好的情況是O(logN)
LeetCode:101.對稱二叉樹
解題思路
轉化為:左右子樹是否鏡像
分解為:樹1的左子樹和樹2的右子樹是否鏡像,樹1的右子樹和樹2的左子樹是否鏡像
符合“分、解、和”特性,考慮選擇分而治之
解題步驟
分:獲取兩個樹的左子樹和右子樹
解:遞歸地判斷樹1的左子樹和樹2的右子樹是否鏡像,樹1的右子樹和樹2的左子樹是否鏡像
合:如果上述都成立,且根節點值也相同,兩個樹就鏡像
時間復雜度O(n),n是樹的節點數,空間復雜度最壞情況是O(n),好的情況是O(logN)
思考題
1、說出分而治之算法的套路步驟
2、用分而治之的套路步驟,描述切西瓜的過程,無需Coding
總結
以上是生活随笔為你收集整理的(十二)算法设计思想之“分而治之”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (十一)进阶算法之“搜索排序”
- 下一篇: 三星:将把生成式人工智能引入手机、平板和