LeetCode 78. Subsets【Java】

题目描述

子集

AC代码
/*
迭代做法:
    假设nums数组中一共有三个数字,nums={1,2,3},那么我们可以通过3位二进制数去表示由这3个数组成的集合
    000 {}
    001 {1}
    010 {2}
    011 {1,2}
    100 {3}
    110 {2,3}
    111 {1,2,3}
    如果数组包含n个数字,那么我们可以用0~2的n次方-1范围内所对应的二进制数就表示.
根据n=num.length,枚举0~2的n次方-1范围内的数字,
看看这个二进制数上的哪一位是1,就把对应下标的数字加入当前子集
*/
class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res=new ArrayList<>();
        for(int i=0;i<1<<nums.length;i++){
            List<Integer> cur=new ArrayList<>();
            for(int j=0;j<nums.length;j++)
                //i的二进制表示的第j位是否为1
                if((i>>j&1)==1)
                    cur.add(nums[j]);
            res.add(cur);
        }
        return res;
    }
}

解释一下i>>j&1==1,假设nums数组的长度是3,现在i=3,那么它的二进制表示就是011,当程序执行进入j的for循环时

ji>>ji>>j&1
0i>>0:011011&001=001第0位上存在1
1i>>1:001001&001=001第1位上存在1
2i>>2:000000&001=000第2位上不存在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值