回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。回溯法可以理解成遞迴的一種特殊形式。最經典的回溯問題是八皇后問題。
回溯問題常用的解決方法是遞迴
題目描述:78題
給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
求解思路與**:
在做這道題時,我首先想到的是迭代的方法。例如給定的例子是nums=[1,2,3],則它的子集有8個。先從空集開始,先加入1,找出1與空集的組合;再加入2,找出2與1和空集的組合,這樣迭代下去。
class
solution
:def
subsets
(self, nums: list[
int])-
> list[list[
int]]:
res =[[
]]for i in nums:
tmp =
[[i]
+ num for num in res]
res = res + tmp
# print("i:",i)
# print("tmp:",tmp)
# print("res:",res)
return res
這個解法如果把中間過程輸出就比較清楚了:
# 當輸入為nums=[1,2,3]時i:1
tmp:[[
1]]res:[[
],[1
]]i:2
tmp:[[
2],[
2,1]
]res:[[
],[1
],[2
],[2
,1]]
i:3tmp:[[
3],[
3,1]
,[3,
2],[
3,2,
1]]res:[[
],[1
],[2
],[2
,1],
[3],
[3,1
],[3
,2],
[3,2
,1]]
回溯演算法
從冪級的定義可以看出,冪級是長度從0到n所有子集的組合。以nums=[1,2,3]為例,分別包括長度為0,1,2,3的子集。
長度為0的子集有:
長度為1的子集有:[1];[2];[3]
長度為2的子集有:[1,2];[1,3];[2,3]
長度為3的子集有:[1,2,3]
以生長長度為2的子集為例:
先取nums[0] = 1為第乙個元素;
將nums[1] = 2新增到當前子集並儲存;
彈出nums[1] ,並且新增nums[2] ;儲存
將nums[1] = 2 作為第乙個元素,新增nums[2]
回溯官方題解:
class
solution
:def
subsets
(self, nums: list[
int])-
> list[list[
int]]:
defbacktrack
(first =
0, curr =
):iflen
(curr)
== k: :]
)else
:for i in
range
(first, n):)
backtrack(i +
1, curr)
curr.pop(
) output =
n =len(nums)
for k in
range
(n +1)
: backtrack(
)return output
官方的題解很好懂,找準遞迴三要素,終止條件、返回值、本層遞迴做的事即可。
這裡本來自己寫了,但是看到大神的解法還是跪了。leetcode題解
class
solution
:def
subsets
(self, nums: list[
int])-
> list[list[
int]]:
res =
n =len(nums)
defhelper
(i, tmp)
:for j in
range
(i, n)
: helper(j +
1,tmp +
[nums[j]])
helper(0,
)return res
LeetCode 回溯演算法總結
全排列 class solution void f vectorint res,vector int nums,vector int s,vector int visited for int i 0 isize i 子集 class solution void f vectorint result,...
leetcode 子集問題(回溯演算法)
給你乙個整數陣列 nums 陣列中的元素 互不相同 返回該陣列所有可能的子集 冪集 解集不能包含重複的子集。你可以按 任意順序 返回解集。示例 1 輸入 nums 1,2,3 輸出 1 2 1,2 3 1,3 2,3 1,2,3 示例 2 輸入 nums 0 輸出 0 解決子集問題最常用的方法就是回...
leetcode 生成括號(回溯演算法)
出處 生成括號 給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 從題目尋找三要素 1 選擇 加左括號 加右括號 2 條件 左括號沒有用完 才可以加左括號 右括號數目小於左括號數目 才可以加右括號 3 結束 左右括號均用完 思路...