演算法系列 回溯演算法(二)子集 排列 組合

2021-10-24 11:16:18 字數 2520 閱讀 6105

繼續歸納回溯演算法

本篇是對子集、排列、組合的實踐

leet上78題

給定一組不含重複元素的整數陣列 nums

返回該陣列所有可能的子集(冪集)

套用模板

class

solution

:def

subsets

(self, nums: list[

int])-

> list[list[

int]]:

res =

n =len(nums)

defbacktrack

(i, tmp)

:for j in

range

(i, n)

: backtrack(j+

1, tmp+

[nums[j]])

backtrack(0,

)return res

變種

nums含有重複元素

剪枝即可

class

solution

:def

subsetswithdup

(self, nums: list[

int])-

> list[list[

int]]:

res =

n =len(nums)

nums.sort(

)def

backtrack

(i, tmp)

:for j in

range

(i, n)

:if j > i and nums[j]

== nums[j-1]

:continue

backtrack(j +

1, tmp +

[nums[j]])

backtrack(0,

)return res

leet上46題

給定乙個沒有重複數字的序列

返回其所有可能的全排列

套用框架

class

solution

:def

permute

(self, nums: list[

int])-

> list[list[

int]]:

res =

defbacktrack

(nums, tmp):if

not nums:

return

for i in

range

(len

(nums)):

backtrack(nums[

:i]+ nums[i+1:

], tmp +

[nums[i]])

backtrack(nums,

)return res

變種

原陣列有重複數

剪枝

class

solution

:def

permuteunique

(self, nums: list[

int])-

> list[list[

int]]:

res =

defbacktrack

(nums, tmp):if

not nums:

return

for i in

range

(len

(nums)):

if nums[i]

in nums[

:i]:

continue

backtrack(nums[

:i]+ nums[i+1:

], tmp +

[nums[i]])

backtrack(nums,

)return res

leet上77題

給定兩個整數 n 和 k

返回 1 ... n 中所有可能的 k 個數的組合

套用框架

class

solution

:def

combine

(self, n:

int, k:

int)

-> list[list[

int]]:

res =

defbacktrack

(i, k, tmp)

:if k ==0:

return

for j in

range

(i, n+1)

: backtrack(j+

1, k-

1, tmp+

[j])

backtrack(

1, k,

)return res

套用框架

剪枝

演算法總結 排列組合與子集問題 排列組合與子集問題

1.組合問題 問題描述 對於一組各不相同的數字,從中任意抽取1 n個數字,構成乙個新的集合。求出所有的可能的集合。例如,對於集合,其所有子集為,給定乙個陣列 元素各不相同 求出陣列的元素的所有非空組合 即陣列的所有非空子集 解法一 位向量法。用乙個輔助陣列表示各個元素的狀態。1表示在集合中,0表示不...

排列組合與回溯演算法

排列組合與回溯演算法 在開始之前,我們先應該看一下回溯演算法的概念,所謂回溯 就是搜尋一棵狀態樹的過程,這個過程類似於圖的深度優先搜尋 dfs 在搜尋的每一步 這裡的每一步對應搜尋樹的第i層 中產生乙個正確的解,然後在以後的每一步搜尋過程中,都檢查其前一步的記錄,並且它將有條件的選擇以後的每乙個搜尋...

排列組合與回溯演算法

排列組合與回溯演算法 kuibing 感謝bamboo leemars的幫助 關鍵字 遞迴dfs 前言 這篇 主要針對排列組合對回溯演算法展開討論,在每乙個討論之後,還有相關的推薦題。在開始之前,我們先應該看一下回溯演算法的概念,所謂回溯 就是搜尋一棵狀態樹的過程,這個過程類似於圖的深度優先搜尋 d...