乙個沒有重複數字的序列,返回其所有可能的全排列。
比如:輸入:[1
,2,3
]返回:[[
1,2,
3],[
1,3,
2],[
2,1,
3],[
2,3,
1],[
3,1,
2],[
3,2,
1]]
這個題目,人腦是很容易想出來解決辦法,用**來實現,就要用到回溯演算法,遞迴來實現。
這裡用深度優先遍歷,比如以1開頭的,第2個位置,可選擇的只有2或3,第3個位置,只剩下乙個,不用選了。
public list
>
permute
(int
nums)
deque path =
newarraydeque
<
>()
;// 遍歷的深度
boolean[
] used =
new boolean[len]
;// 記錄在某個序列中,元素是否被使用過。
dfs(nums,len,
0, path, used, res)
;return res;
}private
void
dfs(
int[
] nums,
int len,
int depth,deque path, boolean[
] used, list
> res)
for(
int i =
0; i < len; i++
)// 如前面的例子,第2個位置,假如放的是2,再次呼叫dfs,path中3會被放入。再呼叫一次,就進入return了。
path.
addlast
(nums[i]);
used[i]
=true
;dfs
(nums,len, depth +
1, path, used, res)
; path.
removelast()
;// 恢復所有的操作,
used[i]
=false;}
}
確實不好理解,但一旦想明白了,就不覺得難了。 如何通過python實現全排列
itertools模組現成的全排列 程式設計客棧 for i in itertools.permutations abcd 4 print join i 相關全排列演算法 def perm l if len l hdedvw 1 return l r for i in range len l s l...
全排列實現
參考的是 演算法競賽入門 p185 方法是用乙個額外的陣列a,不斷放入物件到這個陣列中,直到n個為止。include using namespace std int total 0 void permutation char s,char a,int n,int cur total cout end...
遞迴實現全排列
生成全排列的最簡單的遞迴方法的思想 1.可以把幾個數字分成前半部和最後一位。對於0123這四個數來說,最後一位 紅色字型 所出現的情況只有以下四類 先不管前三個數的排列組合情況 3 2 1 0這樣我們就把四個數字的排列問題,變成了3個 對於上述的每一行來說 2.終結條件是1個數字的排列就是其本身。直...