全排列 全排列ii 子集 子集ii

2021-10-17 19:03:27 字數 2950 閱讀 8727

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 ...