問題:給定乙個可能具有重複數字的列表,返回其所有可能的子集。
樣例 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...