回溯 leetcode回溯演算法

2022-09-07 07:36:12 字數 2649 閱讀 8254

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。回溯法可以理解成遞迴的一種特殊形式。

最經典的回溯問題是八皇后問題。

回溯問題常用的解決方法是遞迴

題目描述: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 結束 左右括號均用完 思路...