第78题. 子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
class Solution {
List<List<Integer>> ans=new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
List<Integer> path=new ArrayList<>();
process(nums,0,path);
return ans;
}
private void process(int[] nums,int i,List<Integer> path){
if(i==nums.length){
ans.add(path);
return;
}
process(nums,i+1,path);
List<Integer> pick=new ArrayList<>(path);
pick.add(nums[i]);
process(nums,i+1,pick);
}
}
思路:
当来到i时:有两 种选择
1:要当前数 process(nums,i+1,path)
2:不要当前数 process(nums,i+1,path+nums[i]);
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res=new ArrayList<>();
List<Integer> path=new ArrayList<>();
process(nums,0,res,path);
return res;
}
private void process(int[] nums,int index,List<List<Integer>> res,List<Integer> path){
if(index==nums.length){
res.add(path);
return;
}
process(nums,index+1,res,path);
List<Integer> list=new ArrayList<>(path);
list.add(nums[index]);
process(nums,index+1,res,list);
}
}
以示例中nums = [1,2,3]为例把求子集抽象为树型结构,如下:

class Solution {
List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合
LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果
public List<List<Integer>> subsets(int[] nums) {
if (nums.length == 0){
result.add(new ArrayList<>());
return result;
}
subsetsHelper(nums, 0);
return result;
}
private void subsetsHelper(int[] nums, int startIndex){
result.add(new ArrayList<>(path));//「遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合」。
if (startIndex >= nums.length){ //终止条件可不加
return;
}
for (int i = startIndex; i < nums.length; i++){
path.add(nums[i]);
subsetsHelper(nums, i + 1);
path.removeLast();
}
}
}

浙公网安备 33010602011771号