给定一组不含重复元素的整数数组 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