78.子集

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

解答:

    vector<vector<int>> res;
    void backtrack(int t,vector<int>&nums,vector<int> cur){
        if(t==nums.size()){
            res.push_back(cur);
            return;
        }
        for(int i=0;i<=1;++i){
            backtrack(t+1,nums,cur);
            cur.push_back(nums[t]);
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<int> cur;
        backtrack(0,nums,cur);
        return res;
    }
 for(int i=0;i<=1;++i){
      backtrack(t+1,nums,cur);
      cur.push_back(nums[t]);
 }
 backtrack(t+1,nums,cur);
 cur.push_back(nums[t]);
 backtrack(t+1,nums,cur);

以上两种写法等效。

Java版本:

    private List<List<Integer>> res=new ArrayList<>();
    private void dfs(int pos,int[] nums,List<Integer> cur){
        if(pos==nums.length){
            res.add(new ArrayList<>(cur));
            return;
        }
        dfs(pos+1,nums,cur);
        cur.add(nums[pos]);
        dfs(pos+1,nums,cur);
        //调用本轮dfs返回之后我们希望cur无改变
        //因为需要回溯遍历其它分支
        cur.remove(cur.size()-1);
    }
    public List<List<Integer>> subsets(int[] nums) {
        dfs(0,nums,new ArrayList<>());
        return res;
    }
posted @ 2020-07-14 23:32  归鸿唱晚  阅读(95)  评论(0编辑  收藏  举报