第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(); } } }