回溯法 重複元素集合 求子集

2021-10-06 03:34:56 字數 1182 閱讀 8767

問題:給定乙個可能具有重複數字的列表,返回其所有可能的子集。

樣例 1:

輸入:[0]

輸出:[

, [0]

]

樣例 2:
輸入:[1,2,2]

輸出:[

[2],

[1],

[1,2,2],

[2,2],

[1,2],

]

思路:

使用回溯法的遞迴框架;

解空間為子集樹;

對於集合**現了重複的數字,需要設計剪枝函式check(i)。規定重複元素的選取狀態只能是前半部分1,後半部分0,從而排除重複項。例如【1,3,3,3】,對於重複元素3的選取,1 0 0結果是,0 1 0結果也是,0 0 1結果還是。那麼只保留第一種情況,0後不能再取1就好了,遇到其餘情況便不再繼續下遞迴。

除此之外,還有另一位老哥的辦法,在去重複元素求子集的基礎上再一步一步新增重複元素,記錄一下。

跳轉到該鏈結

#include

using namespace std;

const

int maxn =

100;

int v[maxn]

=,x[maxn]=;

intbacktrack

(int i,

int n)

;int

check

(int i)

;int

main()

intbacktrack

(int i,

int n)

} cout<<

" }"

<}else}}

intcheck

(int i)

lintcode參考**:
class solution 

; vectorint>>

subsetswithdup

(vector<

int>

&nums)

intbacktrack

(int i,

int n,vector<

int> nums)

v.push_back

(tempv);}

else}}

};

回溯 含有相同元素求子集

90.subsets ii medium for example,if nums 1,2,2 a solution is 2 1 1,2,2 2,2 1,2 題目描述 給定乙個集合,集合中有重複元素,返回其所有的不重複子集。思路分析 求集合的子集,用回溯法進行解決。由於有重複元素,那麼我們先對集合進...

子集生成之增量構造法 允許有重複元素

假設集合s中有n個元素,它的子集的元素個數可以為1至n個,這個問題等價於有n個桶,按順序擺好並編號0 n 1,然後我們依次走到這n個桶面前,此時我們可以決定不放元素,或者放乙個元素,因為集合是無序的 集合和相同 所以我們可以事先將s中的元素排序,這樣我們走到編號為step的桶前只需考慮是否放入乙個s...

Set集合重複元素的判斷

set集合比較特殊,他的方法基本上和collection介面的方法一致,並且他沒有根據索引得到對應值的get int index 方法.更重要的是set集合不能放置重複的元素.她是怎麼判斷的呢?那麼,我們首先要讓物件具有比較性 一,儲存的自定義物件實現介面 comparable 複寫public i...