17 子集(遞迴)

2021-08-21 15:31:06 字數 1702 閱讀 7582

給定乙個含不同整數的集合,返回其所有的子集

子集中的元素排列必須是非降序的,解集必須不包含重複的子集

您在真實的面試中是否遇到過這個題?  是

如果 s =[1,2,3],有如下的解:

[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

]

你可以同時用遞迴與非遞迴的方式解決麼?

遞迴的方法:

不要去想遞迴是如何一層一層呼叫的,而是要想如果解決當前問題,找到遞迴的出口

可以這樣思考,由於原集合每乙個數字只有兩種狀態,要麼存在,要麼不存在,那麼在構造子集時就有選擇和不選擇兩種情況,所以可以構造一棵二叉樹,左子樹表示選擇該層處理的節點,右子樹表示不選擇,最終的葉節點就是所有子集合,樹的結構如下:

/ \

/ \

/ \

[1]

/ \ / \

/ \ / \

[1 2] [1] [2]

/ \ / \ / \ / \

[1 2 3] [1 2] [1 3] [1] [2 3] [2] [3]

**如下:

class solution 

void gensubsets(vector& nums, int start, vector& sub, vector>& subs)

}};

二:含有重複元素的子集合

for example,

if s =[1,2,2], a solution is:

[

[2],

[1],

[1,2,2],

[2,2],

[1,2],

]

思想:根據上面子集合 裡的構建樹的方法,在處理到第二個2時,由於前面已經處理了一次2,這次我們只在新增過2的[2] 和 [1 2]後面新增2,其他的都不新增,那麼這樣構成的二叉樹如下圖所示:

/ \

/ \

/ \

[1]

/ \ / \

/ \ / \

[1 2] [1] [2]

/ \ / \ / \ / \

[1 2 2] [1 2] x [1] [2 2] [2] x

class solution 

void gensubsets(vector& nums, int start, vector& sub, vector>& subs)

}};

lintcode 第17題 子集

要求 給定乙個含不同整數的集合,返回其所有的子集 注意事項 子集中的元素排列必須是非降序的,解集必須不包含重複的子集。樣例 如果 s 1,2,3 有如下的解 3 1 2 1,2,3 1,3 2,3 1,2 思路 不考慮非降序,乙個個數字插進去,每一層插進去乙個,每乙個都有兩種情況,加進去和不加進去。...

78 子集 遞迴 冪集

一開始我想使用全排列的思路來解決這道題目,但是會出現重複遍歷的問題。這道題可以考慮使用當前選不選該數來決定該數計不計入當前的排列。注意遞迴出口,不能直接將list加入result中,而是需要新建乙個list再加入結果列表中。class solution public void dfs int num...

Golang 17 遞迴函式

遞迴,就是在執行的過程中呼叫自己。語法格式如下 func recursion func main go 語言支援遞迴。但我們在使用遞迴時,開發者需要設定退出條件,否則遞迴將陷入無限迴圈中。遞迴函式對於解決數學上的問題是非常有用的,就像計算階乘,生成斐波那契數列等。以下例項通過 go 語言的遞迴函式實...