非空子集《算法很美》

非空子集

思路: 其实主要理解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,属于浅拷贝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值