给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
方法一:
初始集合s为空,依次从数组里取出一个元素e,用e和s生成新的集合,新的集合为s+s*e.
例:【1,2,3】
init: {}
select 1: {{1}}
select 2: {{1}, {2}, {1,2}}
select 3: {{1}, {2}, {1,2}, {3}, {1,3}, {2,3}, {1,2,3}}
最后再插入一个空集:{{1}, {2}, {1,2}, {3}, {1,3}, {2,3}, {1,2,3}, {}}
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> lists=new ArrayList();
if(nums.length==0)return lists;
for(int i=0;i<nums.length;i++){
int size=lists.size();
for(int j=0;j<size;j++){
ArrayList<Integer> temp=new ArrayList();
temp.addAll(lists.get(j));
temp.add(nums[i]);
lists.add(temp);
}
ArrayList<Integer> tempn=new ArrayList();
tempn.add(nums[i]);
lists.add(tempn);
}
lists.add(new ArrayList<Integer>());
return lists;
}
}
方法二、
递归+回溯法
class Solution {
List<List<Integer>> lists;
public List<List<Integer>> subsets(int[] nums) {
lists=new ArrayList();
if(nums.length==0)return lists;
lists.add(new ArrayList<Integer>());
dfs(nums,0,new ArrayList<Integer>());
return lists;
}
//levellist保存的是index个元素
private void dfs(int[] nums,int index,ArrayList<Integer>levellists){
if(index>=nums.length){
return;
}
for(int i=index;i<nums.length;i++){
levellists.add(nums[i]);
lists.add(new ArrayList(levellists));
dfs(nums,i+1,levellists);
levellists.remove(levellists.size()-1);
}
}
}