[力扣] 78. 子集

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

该题目来自力扣题库
示例

输入: nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

思路

使用位图法
如果该数组的长度是n,那么该数组的所有子集数目是2^n.
使用两层循环,外层循环的次数是子集的个数;内层循环的次数是数组的长度,是用来判断 i 的二进制哪一位是1,哪一位是0。如果是1,那么会输出这一位所对应的数组的内容,如果是0,不会输出。
判断 i 的二进制哪个位是0或1,看i>>j%2等于1还是等于0.

在这里插入图片描述

代码
class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res=new ArrayList<>();
        int len=nums.length;
        for(int i=0;i<Math.pow(2,len);i++){
            List<Integer> tmp=new ArrayList<Integer>();
            for(int j=0;j<len;j++){
                if((i>>j)%2==1){
                    tmp.add(nums[j]);
                }
            }
            res.add(tmp);
        }
    return res;
    }
}
总结

ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口。

1.创建一个ArrayList集合

ArrayList<String> list=new ArrayList<String>();

2.创建一个初始化长度为100的ArrayList集合

List<String> initlist = new ArrayList<>(100);

3.ArrayList常用方法

 add(E element);
 //新增元素
 remove(int index);
 //删除元素 
 set(int index, E element);
 //通过传入的数字下标找到对应的位置,替换其中的元素,前提也需要首先判断传入的数组下标是否越界
 get(int index);
 //通过下标查找即可
 size();
 //获取集合长度,通过定义在ArrayList中的私有变量size得到
isEmpty();
//是否为空,通过定义在ArrayList中的私有变量size得到
contains(Object o);
//是否包含某个元素,通过遍历底层数组elementData,通过equals或==进行判断
clear();
//集合清空,通过遍历底层数组elementData,设置为null
发布了23 篇原创文章 · 获赞 46 · 访问量 2869

猜你喜欢

转载自blog.csdn.net/qq_45619426/article/details/104288458