问题
给你一个整数数组 nums ,数组中的元素互不相同(也可以相同) 。返回该数组所有可能的子集(幂集)。解集可以包含重复的子集。你可以按任意顺序返回解集。
方法
- 方法一:枚举
可以先new一个list,里面的元素还是list。我们每次将一个元素向list里面的每个list中添加后重新放入list中。直至循环结束
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res=new ArrayList<>();
List<Integer> tmp;
res.add(new ArrayList<>());
for (int i = 0; i < nums.length; i++) {
int len=res.size();
for (int j = 0; j < len; j++) {
tmp=new ArrayList<>(res.get(j));
tmp.add(nums[i]);
res.add(new ArrayList<>(tmp));
tmp.clear();
}
}
return res;
}
}
- 方法二:回溯,每一个元素都有放进去和不放进去2种可能。
class Solution {
List<List<Integer>> res=new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
res.add(new ArrayList<>());
int pos=0;
List<Integer> list=new ArrayList<>();
huisu(nums,pos,list);
return res;
}
void huisu(int[] nums,int pos,List<Integer> list){
if(pos==nums.length&&!list.isEmpty()){
res.add(new ArrayList(list));
}
if(pos<nums.length){
list.add(nums[pos]);
huisu(nums,pos+1,list);
list.remove(list.indexOf(nums[pos]));
huisu(nums,pos+1,list);
}
}
}