本文 已經收錄,裡面還有leetcode刷題攻略、各個型別經典題目刷題順序、思維導圖,可以fork到自己倉庫,有空看一看一定會有所收穫,如果對你有幫助也給乙個star支援一下吧!在回溯演算法:求子集問題(二)中,開始針對子集問題進行去重。
本題就是回溯演算法:求子集問題!的基礎上加上了去重,去重我們在回溯演算法:求組合總和(三)也講過了。
所以本題對大家應該並不難。
樹形結構如下:
在回溯演算法:遞增子串行中,處處都能看到子集的身影,但處處是陷阱,值得好好琢磨琢磨!
樹形結構如下:
詳細在本週小結!(回溯演算法系列三)續集中給出了介紹!
我們已經分析了組合問題,分割問題,子集問題,那麼回溯演算法:排列問題! 又不一樣了。
排列是有序的,也就是說[1,2] 和[2,1] 是兩個集合,這和之前分析的子集以及組合所不同的地方。
可以看出元素1在[1,2]中已經使用過了,但是在[2,1]中還要在使用一次1,所以處理排列問題就不用使用startindex了。
如圖:
排列問題也要去重了,在回溯演算法:排列問題(二)中又一次強調了「樹層去重」和「樹枝去重」。
樹形結構如下:
這道題目神奇的地方就是used[i - 1] == false也可以,used[i - 1] == true也可以!
我就用輸入: [1,1,1] 來舉乙個例子。
樹層上去重(used[i - 1] == false),的樹形結構如下:
樹枝上去重(used[i - 1] == true)的樹型結構如下:
可以清晰的看到使用(used[i - 1] == false),即樹層去重,效率更高!
之前並沒有分析各個問題的時間複雜度和空間複雜度,這次來說一說。
這塊網上的資料魚龍混雜,一些所謂的經典面試書籍根本不講回溯演算法,演算法書籍對這塊也避而不談,感覺就像是演算法裡模糊的邊界。
子集問題分析:
排列問題分析:
組合問題分析:
一般說道回溯演算法的複雜度,都說是指數級別的時間複雜度,這也算是乙個概括吧!
本週我們對子集問題進行了去重,然後介紹了和子集問題非常像的遞增子串行,如果還保持慣性思維,這道題就可以掉坑里。
接著介紹了排列問題!,以及對排列問題如何進行去重。
最後我補充了子集問題,排列問題和組合問題的效能分析,給大家提供了回溯演算法複雜度的分析思路。
就醬,「**隨想錄」一直都是乾貨滿滿,值得介紹給身邊的朋友們!
如果感覺對你有幫助,不要吝嗇給乙個?吧!
leetcode 本週小結!(貪心演算法系列四)
本文 已經收錄,裡面還有leetcode刷題攻略 各個型別經典題目刷題順序 思維導圖,可以fork到自己倉庫,有空看一看一定會有所收穫,如果對你有幫助也給乙個star支援一下吧!在貪心演算法 用最少數量的箭引爆氣球中,我們開始講解了重疊區間問題,用最少的弓箭射爆所有氣球,其本質就是找到最大的重疊區間...
手把手帶你學演算法 本週小結!(貪心演算法系列三)
本文 已經收錄,裡面還有leetcode刷題攻略 各個型別經典題目刷題順序 思維導圖,可以fork到自己倉庫,有空看一看一定會有所收穫,如果對你有幫助也給乙個star支援一下吧!本週開始恢復了題目系列。對於貪心,大多數同學都會感覺,不就是常識嘛,這算啥演算法,那麼本週的題目就可以帶大家初步領略一下貪...
總結 貪心演算法 本週小結!(貪心演算法系列四)
在貪心演算法 用最少數量的箭引爆氣球中,我們開始講解了重疊區間問題,用最少的弓箭射爆所有氣球,其本質就是找到最大的重疊區間。按照左邊界經行排序後,如果氣球重疊了,重疊氣球中右邊邊界的最小值 之前的區間一定需要乙個弓箭 如圖 模擬射氣球的過程,很多同學真的要去模擬了,實時把氣球從陣列中移走,這麼寫的話...