分治法,顧名思義就是分而治之矫渔,即把問題拆解為性質(zhì)相同的小問題再處理彤蔽。
做了一些題后發(fā)現(xiàn),分治法除了分治庙洼,名字里還少了一步顿痪,那就是合,也就是怎樣通過小問題的答案得到拆分之前大問題的答案油够。
分治法的時(shí)間復(fù)雜度:分治法并沒有像二分法一樣每次丟掉一半無用的解蚁袭,它只是做了分離,而分離的兩部分都是需要處理的石咬,所以分治法的時(shí)間復(fù)雜度是O(n)揩悄。特例情況是當(dāng)分離的兩部分繼續(xù)分治處理出現(xiàn)重復(fù)計(jì)算的情況時(shí),就會(huì)比O(n)大了鬼悠!所以請確保你的分治盡量不要出現(xiàn)重疊計(jì)算的情況删性。
那么什么問題適合用分治的思想解決呢?二叉樹焕窝!二叉樹這種左右子樹的結(jié)構(gòu)天生就非常適合分治蹬挺,所以它的大部分問題都能用分治解決,碰到一個(gè)問題你只需要問問左子樹你怎么處理它掂,右子樹你怎么辦巴帮,得到左右子樹的答案后,你再想想最后的答案是個(gè)啥~除了二叉樹虐秋,快速排序歸并排序這兩個(gè)著名的排序算法也是分治的思想榕茧。下面就舉幾個(gè)解題的例子來加深一下對(duì)分治法的學(xué)習(xí)。
1客给、前序遍歷二叉樹
2用押、求二叉樹的最大路徑和
給一棵二叉樹,找出從根節(jié)點(diǎn)出發(fā)的路徑中起愈,和最大的一條只恨。
這條路徑可以在任何二叉樹中的節(jié)點(diǎn)結(jié)束,但是必須包含至少一個(gè)點(diǎn)抬虽。
3官觅、求最近公共祖先
給定一棵二叉樹,找到兩個(gè)節(jié)點(diǎn)的最近公共父節(jié)點(diǎn)(LCA)阐污,給出的兩個(gè)節(jié)點(diǎn)都在樹中存在休涤。
4、快速排序
這里我就偷個(gè)懶,直接貼出百度百科上給的php標(biāo)準(zhǔn)答案~