(1)問題描述:對於給定的集合 a,其中的 n 個元素互不相同,如何輸出這 n 個元素的所有排列(全排列),時間複雜度為o(2n);
例如:全排列:, , , , ,
(2)回溯演算法思想:
這裡以 a 為例,來說明全排列的生成方法,對於這個集合,其包含 3 個元素,所有的排列情況有 3!=6 種,對於每一種排列,其第乙個元素有 3 種選擇 a, b, c,對於第乙個元素為 a的排列,其第二個元素有 2 種選擇 b, c;第乙個元素為 b 的排列,第二個元素也有2種選擇a,c,……,依次類推,我們可以將集合的全排列與一棵多叉樹對應。如下圖所示:
(3)演算法**:
public classfullpermutation /*** 初始化資料*/
private static voidinitdata() /*** 遞迴回溯排列樹求解*/
private static void backtrack(intt) for (int i = t; i < data.length; i++) public static voidmain(string args) {//初始化資料
initdata();//遞迴回溯排列樹求解
backtrack(0);
(4)輸入輸出
請輸入資料數量:4請輸入陣列資料1 2 3 4排列數為:1 1 2 3排列數為:1 1 3 2排列數為:1 2 1 3排列數為:1 2 3 1排列數為:1 3 2 1排列數為:1 3 1 2排列數為:1 1 2 3排列數為:1 1 3 2排列數為:1 2 1 3排列數為:1 2 3 1排列數為:1 3 2 1排列數為:1 3 1 2排列數為:2 1 1 3排列數為:2 1 3 1排列數為:2 1 1 3排列數為:2 1 3 1排列數為:2 3 1 1排列數為:2 3 1 1排列數為:3 1 2 1排列數為:3 1 1 2排列數為:3 2 1 1排列數為:3 2 1 1排列數為:3 1 2 1排列數為:3 1 1 2
(5)總結:回溯演算法是有一定的規律可循的,根據問題,找出解空間的組織結構,選擇恰當的解決方案:回溯演算法模板。
回溯演算法一般採用深度優先的方式,遞迴求解,人的思維一般對遞迴求解的問題有一定的想象難度,建議在紙上根據**的流程,畫一畫走一遍詳細的過程,便於理解回溯演算法的核心要點。
回溯演算法 全排列
1 問題描述 對於給定的集合 a,其中的 n 個元素互不相同,如何輸出這 n 個元素的所有排列 全排列 時間複雜度為o 2n 例如 全排列 2 回溯演算法思想 這裡以 a 為例,來說明全排列的生成方法,對於這個集合,其包含 3 個元素,所有的排列情況有 3 6 種,對於每一種排列,其第乙個元素有 3...
回溯(全排列)
題 輸出自然數 1 到 n 所有不重複的排列,即 n 的全排列,要求所產生的任一數字序列中不允許出現重複的數字。輸入格式 乙個整數 n 1 n 9 輸出格式 由 1 n組成的所有不重複的數字序列,每行乙個序列。每個數字保留 5個常寬。sample input 3sample output 1 2 3...
LeetCode 全排列 回溯
傳送門 給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 參考官方題解 時間複雜度是 o k 1n p n,k o sum p n,k o k 1 n p n,k p n k n n k n n ...