leetcode 78. 子集

一、题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

二、解法

解法一:位操作遍历
0表示不取,1表示取,那么全集就是111…11,空集就是00…00,一共有 2 n − 1 2^n-1 2n1个元素

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        int n=nums.size();
        vector<vector<int>> ans;
        int all=(1<<n);
        for(int i=0;i<all;++i){
            vector<int> cur;
            for(int j=0;j<n;++j){
                if(i&(1<<j)){
                    cur.push_back(nums[j]);
                }
            }
            ans.push_back(cur);
        }
        return ans;
    }
};

解法二:回溯
最基本的回溯思想,两种选择:加入该元素,或者不加

class Solution {
public:
    void dfs(vector<vector<int>> &ans,vector<int>& nums,vector<int> &cur,int idx){
        if(idx==nums.size()){
            ans.emplace_back(cur);
            return;
        }

        //不加该元素
        dfs(ans,nums,cur,idx+1);
        //加该元素
        cur.push_back(nums[idx]);
        dfs(ans,nums,cur,idx+1);
        cur.pop_back();
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int> cur;
        dfs(ans,nums,cur,0);
        return ans;
    }
};

你可能感兴趣的:(leetcode,100题,dfs,leetcode)