繼續歸納回溯演算法
本篇是對子集、排列、組合的實踐
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...