Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
分析:如果仍用subsets的方法来做,里面会有重复的item,例如010和001的到的item都为[2]
方法一:subsets改进
DFS(s, layer, item) {
if(layer == s.size()) {
for(int i = 0; i < ret.size(); i++) {
if(ret.at(i) == item) return; //此处也可以用ret[i];
}
ret += item;
}
DFS(s, layer+1, item);
item.push_back(s[layer]);
DFS(s, layer+1, item);
}
方法二:以{1、2、3}为例,根据 空子集 + {1...、 2...、 3... }来构建树,每一次函数调用访问树的所有子节点。然后去重
ret += path; //空子集
DFS(s, start, path) {
for(i = start; i < s.size(); i++) {
if(i != start && s[i] == s[i-1]) continue;
path += s[i];
ret += path;
DFS(s, i+1; path);
path -= s[i];
}
}