有重複數字的全排列
元素奇偶相間的排列
給定乙個沒有重複數字
的序列,返回其所有可能的全排列
。
輸入: [1,2,3]利用 回溯法排列樹模板 ,沒有限定條件即就是輸出:[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
沒有衝突
。
class
solution
:def
permute
(self, nums: list[
int])-
> list[list[
int]]:
self.x = nums
self.n =
len(nums)
self.backtrack(0)
return self.x
def__init__
(self)
: self.n =
0 self.x =
self.x =
defconflict
(self, k)
:return
false
defbacktrack
(self, k)
:if k>=self.n::]
)else
:for i in
range
(k,self.n)
: self.x[i]
, self.x[k]
= self.x[k]
, self.x[i]
ifnot self.conflict(k)
: self.backtrack(k+1)
self.x[i]
, self.x[k]
= self.x[k]
, self.x[i]
給定乙個可包含重複數字
的序列,返回所有不重複的全排列
。
輸入: [1,1,2]解題思路與無重複數字的全排列輸出:[
[1,1,2],
[1,2,1],
[2,1,1]
]
一致
,只是結果進行去重
。
class
solution
:def
permuteunique
(self, nums: list[
int])-
> list[list[
int]]:
self.x = nums
self.n =
len(nums)
self.backtrack(0)
return
list
(set
(tuple
(i)for i in self.x)
)def
__init__
(self)
: self.x =
self.n =
0 self.x =
defconflict
(self, k)
:return
false
defbacktrack
(self, k)
:if k >= self.n::]
)else
:for i in
range
(k, self.n)
: self.x[i]
, self.x[k]
= self.x[k]
, self.x[i]
ifnot self.conflict(k)
: self.backtrack(k+1)
self.x[i]
, self.x[k]
= self.x[k]
, self.x[i]
給定乙個沒有重複數字
的序列,返回元素奇偶相間的排列
。
與全排列
解題思路一致,只是每個節點進行衝突檢測以剪枝
。
class
permtree
:def
__init__
(self, data)
: self.n =
len(data)
self.x = data # 乙個解
self.x =
# # 一組解
#突檢測:元素奇偶相間的排列
defconflict
(self, k)
:if k==0:
# 第乙個元素,肯定無衝突
return
false
if self.x[k-1]
%2== self.x[k]%2
:# 只比較 x[k] 與 x[k-1] 奇偶是否相同
return
true
return
false
# 無衝突
defbacktrack
(self, k)
:# 到達第k個位置
if k >= self.n:
# 超出最尾的位置:]
)# 注意x[:]
else
:for i in
range
(k, self.n)
:# 遍歷後面第 k~n-1 的位置
self.x[k]
, self.x[i]
= self.x[i]
, self.x[k]
ifnot self.conflict(k)
:# 剪枝
self.backtrack(k+1)
self.x[i]
, self.x[k]
= self.x[k]
, self.x[i]
# 回溯
defsovleperm
(self)
: self.backtrack(0)
return self.x
LeetCode 全排列II(回溯法)
給定乙個可包含重複數字的序列,返回所有不重複的全排列。示例 輸入 1,1,2 輸出 1,1,2 1,2,1 2,1,1 思路分析 請先參考 leetcode 全排列 的解法。第一種方法 利用set容器中 元素的唯一性 進行去重。第二種方法 修改為set容器 class solution void d...
全排列(回溯法的應用)
解決乙個回溯問題,實際上就是乙個決策樹的遍歷過程 1 路徑 也就是已經做出的選擇。2 選擇列表 也就是你當前可以做的選擇。3 結束條件 也就是到達決策樹底層,無法再做選擇的條件。一 全排列問題 for 選擇 in 選擇列表 做選擇 將該選擇從選擇列表移除 路徑.add 選擇 backtrack 路徑...
回溯(全排列)
題 輸出自然數 1 到 n 所有不重複的排列,即 n 的全排列,要求所產生的任一數字序列中不允許出現重複的數字。輸入格式 乙個整數 n 1 n 9 輸出格式 由 1 n組成的所有不重複的數字序列,每行乙個序列。每個數字保留 5個常寬。sample input 3sample output 1 2 3...