2、全排列ii
3、子集
4、子集ii
5、資料排列
解題步驟
首先,要通過讀題完成下面三個步驟:
(1)描述解的形式,定義乙個解空間,它包含問題的所有解。
(2)構造狀態空間樹。
(3)構造約束函式(用於殺死節點)。
標準回溯模板
# 回溯演算法,複雜度較高,因為回溯演算法就是暴力窮舉,遍歷整顆決策樹是不可避免的
res =
defbacktrack
(路徑, 選擇列表)
:if 滿足結束條件:
return
for 選擇 in 選擇列表:
# 核心**段
做出選擇
遞迴執行backtrack
撤銷選擇
排列場景回溯模板
問題給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。
輸入: [1,2,3]
輸出:[[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]
思路回溯演算法:先固定第一位(1),再固定第二位(2),第三位只能是(3);接下來第一位仍然為(1),第二位是(3),第三位是(2);此處屬於不包括重複元素的回溯法
下圖中每一條路徑為全排列的結果
**實現
def
permute
(nums)
: res =
defbacktrace
(nums, tmp):if
not nums:
return
for i in
range
(len
(nums)):
backtrace(nums[
:i]+ nums[i + i:
], tmp +
[nums[i]])
backtrace(nums,
)return res
問題
給定乙個可包含重複數字的序列 nums ,按任意順序 返回所有不重複的全排列。
輸入:nums = [1,1,2]
輸出:[[1,1,2], [1,2,1], [2,1,1]]
輸入:nums = [1,2,3]
輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路
**實現
class
solution
:def
permuteunique
(self, nums: list[
int])-
> list[list[
int]]:
nums.sort(
) res =
defbacktrace
(nums, temp)
: visited =
ifnot nums and temp not
in res:
return
for i in
range
(len
(nums)):
if nums[i]
notin visited:
) backtrace(nums[
:i]+ nums[i +1:
], temp +
[nums[i]])
backtrace(nums,
)return res
問題
給你乙個整數陣列 nums ,陣列中的元素 互不相同 。返回該陣列所有可能的子集(冪集)。
解集 不能 包含重複的子集。你可以按 任意順序 返回解集。
輸入:nums = [1,2,3]
輸出:[,[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
輸入:nums = [0]
輸出:[,[0]]
思路**實現
def
subsets
(nums)
: res =
defbacktrack
(nums, tmp)
:for i in
range
(len
(nums)):
backtrack(nums[i+1:
], tmp+
[nums[i]])
backtrack(nums,
)return res
問題
給定乙個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
輸入: [1,2,2]
輸出:[[2],[1],[1,2,2],[2,2],[1,2],]
思路還是去重!!!排序!!!
**實現
def
subsetswithdup
(nums)
: nums.sort(
) res =
defbacktrace
(nums, temp)
: visited =
for i in
range
(len
(nums)):
if nums[i]
notin visited:
) backtrace(nums[i+1:
], temp +
[nums[i]])
backtrace(nums,
)return res
求子集 全排列
求子集 給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 思路 1 確定乙個tags標記陣列,用於確定某個元素是否被選擇 2 確定遞迴的終止條件為 確定元素是...
90 子集 II 46 全排列 回溯 剪枝
給定乙個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 1,2,2 輸出 2 1 1,2,2 2,2 1,2 param nums return var subsetswithdup function nums let tmppath ...
46 全排列 47 全排列II
46.全排列 這題和之前做的劍指offer上的字串全排列。一樣。分析 1 如果原始要排列的陣列順序為1 2 3 4,現在只要分別交換1 2,1 3,1 4然後對剩下的3個元素進行遞迴的排列。自己的code 100 class solution if start nums.size 1 return ...