第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]为例把求子集抽象为树型结构,如下:

78.子集

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

  

 

posted @ 2021-09-21 09:37  sherry001  阅读(20)  评论(0编辑  收藏  举报