❝ 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。許多複雜的,規模較大的問題都可以使用回溯法,有「通用解題方法」的美稱。回溯法:一種通過探索所有可能的候選解來找出所有的解的演算法。如果候選解被確認不是乙個解的話(或者至少不是最後乙個解),回溯演算法會通過在上一步進行一些變化拋棄該解,即回溯並且再次嘗試。❞
回溯問題,實際上就是決策樹的遍歷過程。
❝ 需要思考 3 個問題:路徑:也就是已經做出的選擇。
選擇列表:也就是你當前可以做的選擇。
結束條件:也就是到達決策樹底層,無法再做選擇的條件。
result =
function backtrack(選擇列表, 路徑)
for 選擇 of 選擇列表
}
❝ 其核心就是 for 迴圈裡面的遞迴,在遞迴呼叫之前「做選擇」,在遞迴呼叫之後「撤銷選擇」。全排列窮舉,以開頭為索引起點,遞迴列舉每個起點開始的所有排列情況,遇到自己則忽略,按照以上的技巧來答題;❞
具體來說就是執行一次深度優先遍歷,從樹的根結點到葉子結點形成的路徑就是乙個全排列。
//給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。
//// 示例:
//// 輸入: [1,2,3]
//輸出:
//[// [1,2,3],
// [1,3,2],
// [2,1,3],
// [2,3,1],
// [3,1,2],
// [3,2,1]
//]// related topics 回溯演算法
//leetcode submit region begin(prohibit modification and deletion)
/** * @param nums
* @return
*/var permute = function (nums)
for (var i = 0; i < nums.length; i++)
};var result = ,
track = ;
backtrack(nums, track, result);
return result;
};
時間複雜度:o(n * n!)
,其中n
為序列的長度。
空間複雜度:o(n)
,其中n
為序列的長度。除答案陣列以外,遞迴函式在遞迴過程中需要為每一層遞迴函式分配棧空間,所以這裡需要額外的空間且該空間取決於遞迴的深度,這裡可知遞迴呼叫深度為o(n)
。
這道題是上題的變體,增加了可重複數字的排列,因此再全排列過程中需要進行剪枝去重;
剪枝的前提條件便是:當前索引的值是否已經入棧;當前索引值與前乙個索引值相等並且已經使用過則跳過,此條件需要序列進行前置排序,不然就無法匹配到相鄰的重複值了;
//給定乙個可包含重複數字的序列,返回所有不重複的全排列。
//// 示例:
//// 輸入: [1,1,2]
//輸出:
//[// [1,1,2],
// [1,2,1],
// [2,1,1]
//]// related topics 回溯演算法
//leetcode submit region begin(prohibit modification and deletion)
/** * @param nums
* @return
*/var permuteunique = function (nums) ;
// 排序是剪枝的必要操作
// 為了判斷相鄰的重複資料是否達到剪枝條件
nums.sort();
var backtrack = function (nums, track, used, depth)
for (var i = 0; i < nums.length; i++)
};backtrack(nums, track, used, 0);
return result;
};//leetcode submit region end(prohibit modification and deletion)
時間複雜度:o(n * n!)
,這裡n
為陣列的長度。
空間複雜度:o(n * n!)
。
閒來刷下「回溯演算法」 - 掘金juejin.im
回溯法遵循深度優先嗎 深度優先搜尋(回溯法)
事實上,深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次.舉例說明之 下圖是乙個無向圖,如果我們從a點發起深度優先搜尋 以下的訪問次序並不是唯一的,第二個點既可以是b也可以是c...
Algorithm 回溯法與深度優先遍歷的異同
1 相同點 回溯法在實現上也是遵循深度優先的,即一步一步往前探索,而不像廣度優先那樣,由近及遠一片一片地掃。2 不同點 1 訪問序 深度優先遍歷 目的是 遍歷 本質是無序的。也就是說訪問次序不重要,重要的是都被訪問過了。可以參見題surrounded regions,深度優先只需要把從邊界起始的 o...
Algorithm 回溯法與深度優先遍歷的異同
1 相同點 回溯法在實現上也是遵循深度優先的,即一步一步往前探索,而不像廣度優先那樣,由近及遠一片一片地掃。2 不同點 1 訪問序 深度優先遍歷 目的是 遍歷 本質是無序的。也就是說訪問次序不重要,重要的是都被訪問過了。可以參見題surrounded regions,深度優先只需要把從邊界起始的 o...