回溯法 全排列

2021-09-29 11:21:39 字數 3259 閱讀 2397

有重複數字的全排列

元素奇偶相間的排列

給定乙個沒有重複數字的序列,返回其所有可能的全排列

輸入: [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...