回溯演算法的原理:回溯演算法是一種選優搜尋法,按照選優條件向前搜尋,以達到目標。但當探索到某一步的時候,發現原先選擇並不優活著達不到目標的時候,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法。
廢話不多說,直接上解決回溯演算法的框架。解決乙個回溯問題,實際上就是乙個決策樹的遍歷過程。你只需要思考如下3個問題:
回溯法的演算法思想和深度優先搜尋(dfs)的思想較為類似,可以結合著看
**方面,回溯演算法的框架如下所示:
result =
def backtrack(路徑,選擇列表):
if 滿足結束條件 :
result.add(路徑)
return
for 選擇 in 選擇列表 :
做選擇backtrack(路徑,選擇列表)
撤銷選擇
其核心就是for迴圈裡面的遞迴,在遞迴呼叫之前「做選擇」,在遞迴呼叫之後「撤銷選擇」,就是這樣。
問題描述如下圖所示:
解決問題的**如下所示,可結合起來進行理解:
class solution
void backtarck(int nums , linkedlisttrack)
for(int i = 0 ; i < nums.length ; i++)
//做選擇
track.add(nums[i]);
//進入下一層決策樹
backtarck(nums,track);
//取消選擇
track.removelast();}}
}
問題描述如下所示:
拓展內容:解法思想:計算遞迴演算法時間複雜度的方法:找到遞迴深度,然後乘以每次遞迴中迭代的次數
首先,空集肯定是乙個子集。
然後,以1開頭的子集有哪些呢? 有[1] [1,2] [1,2,3]
同理,以2開頭的子集有[2] [2,3]
以3開頭的子集有[3]
最後,把上面這些子集加起來就是【1,2,3】的所有子集
**解法如下所示:
class solution
void backtrack(int nums , int start , linkedlisttrack)
}}
可以看見,由start
引數實現了剛才所說的「以某個數字開頭的子集」;而對res
的更新處在前序遍歷的位置,所以說res
記錄了樹上的所有結點,也就是所有的子集
有關括號問題,你只需要記住以下性質,思路就很容易想出來:
排序演算法學習心得
近期終於弄懂了六種演算法,寫個小部落格記錄下 一 六種演算法解析 1 直接插入排序 2 演算法特點 保證每一次遍歷後,前面的資料都是排序好的 2 public static int insert int arr arr pos arr i arr i temp return arr 3 氣泡排序 1...
關於PCA演算法學習心得
壓縮的實質就是針對樣本的屬性,讓單個屬性的方差最大,讓樣本之間的協方差的為零。pca演算法的是針對原始樣本的協方差c的變換,通過對協方差矩陣c的對角化,找到對映後的樣本的協方差矩陣y。需要注意的是,此時d是對角陣,從而滿足了我們優化的要求 協方差為零,方差最大。d 1myy t1m px px t ...
小白演算法學習心得(c )
很長時間沒有寫部落格了,原因主要就是忙著上課或者是學習之類的。絕對不是貪玩 最近簡單的學習了一部分演算法,於是簡單的總結一下自己學習的經歷。前話在大一上學期,學長就開始教我們一些演算法,dp,貪心之類的,但是很長時間就是不了解為什麼要這樣寫,當時也被遞迴弄暈了很長很長時間,於是我寫下這篇簡單的自我學...