非空子集
思路: 其实主要理解HashSet即可,利用HashSet集合的不重复原则。
利用HashSet嵌套
public Set<Set<Integer>> getSubsets2(int[] A, int n) {
Set<Set<Integer>> res = new HashSet<>();
Set<Integer> res_new = new HashSet<>();
res_new.add(1);
res_new.add(1);
res_new.add(2);
res_new.add(3);
res.add(res_new);//初始化为空集
return res;
}
结果为:[[1, 2, 3]]
具体思路:
创建一个大集合res,里面嵌套着一个小集合,然后遍历,每次遍历要把原本的子集和放到大集合里面,然后再遍历,将之前的元素拷贝到当前元素中。
结果:[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
例如:
[1,2]是将[1]拷贝到[2]中,形成[1,2]。
[1, 3], [2, 3], [1, 2, 3]是将[1],[2],[1,2]分别拷贝到[3]中形成的。
public class 非空子集 {
public static void main(String[] args){
int[] A = {1, 2, 3};
Set<Set<Integer>> subsets2 = new 非空子集().getSubsets2(A, A.length);
System.out.println(subsets2);
}
/*逐步生成迭代大法*/
public Set<Set<Integer>> getSubsets2(int[] A, int n) {
Set<Set<Integer>> res = new HashSet<>();
res.add(new HashSet<>());//初始化为空集
//从第一个元素开始处理
for (int i = 0; i < n; i++) {
Set<Set<Integer>> res_new = new HashSet<>();//新建一个大集合
res_new.addAll(res);//把原来集合中的每个子集都加入到新集合中
//遍历之前的集合,全部克隆一遍
for (Set e : res) {
Set clone = (Set) ((HashSet) e).clone();
clone.add(A[i]);//把当前元素加进去
res_new.add(clone);//把克隆的子集加到大集合中
}
res = res_new;
}
return res;
}
}
结果:[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
知识点: clone() 方法。
clone() 方法用于复制一份 hashMap,属于浅拷贝。