给定一个可能具有重复数字的列表,返回其所有可能的子集
您在真实的面试中是否遇到过这个题?
Yes
样例
如果S = [1,2,2],一个可能的答案为:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
注意
子集中的每个元素都是非降序的
两个子集间的顺序是无关紧要的
解集中不能包含重复子集
标签 Expand
您在真实的面试中是否遇到过这个题?
Yes
样例
如果S = [1,2,2],一个可能的答案为:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
注意
子集中的每个元素都是非降序的
两个子集间的顺序是无关紧要的
解集中不能包含重复子集
标签 Expand
相关题目 Expand
解题思路:
DFS+递归 实现
数组中的每一个数字都可以选择要或者不要。比如{1,2,3}.1 可以选择要或者不要,2,3也一样。
在加入时候,需要判断是否重复
class Solution {
/**
* @param S: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
public ArrayList<ArrayList<Integer>> subsetsWithDup(ArrayList<Integer> S) {
// write your code here
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
ArrayList<Integer> tmp = new ArrayList<>();
Collections.sort(S);
subsetWithDup(res, tmp, S, 0);
return res;
}
@SuppressWarnings("unchecked")
public void subsetWithDup(ArrayList<ArrayList<Integer>> res,
ArrayList<Integer> tmp, ArrayList<Integer> S, int n) {
if (S.size() == n) {
boolean flag = false; // res中是否存在tmp值的arraylist.
for (int i = 0; i < res.size(); i++) {
if (res.get(i).equals(tmp)) {
flag = true;
break;
}
}
if (!flag) {
res.add((ArrayList<Integer>) tmp.clone());
}
return;
}
//不要这个数字
subsetWithDup(res, tmp, S, n+1);
//要这个数字
tmp.add(S.get(n));
subsetWithDup(res, tmp, S, n+1);
tmp.remove(tmp.size()-1);
}
}