位方法 子集生成

题目描述

请编写一个方法,返回某集合的所有非空子集。

给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。

测试样例:

[123,456,789]
返回:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}

 

【常规思路】

先将源数组排序,排序的规则是按照从大到小(确保从前往后抽取出来的元素 也就是子集内部递减)

采取DFS方法,获得子集。   对于每一个元素 或者选  或者不选 

class Subset {
public:
    static bool cmp(int a,int b)
    {
        return a>b;
    }
    static bool cmp2(vector a,vector b)
    {
        
        int small=min(a.size(),b.size());
        for(int i=0;ito_string(b[i]);
               // return string(a[i])>string(b[i]);//字典序排序
            }
            
            
            
        }
        return a.size()>b.size();//哪边有剩余
        
    }
    vector > getSubsets(vector A, int n) {
        // write code here
        sort(A.begin(),A.end(),cmp);  //将原先数字从大到小排序
        vector> ans;
        vector path;
        dfs(ans,path,0,n,A);
        sort(ans.begin(),ans.end(),cmp2);
        return ans;  
        
    }
    
    void dfs(vector>&res,vector path,int depth,int maxdepth,const vector&A)
    {
        if(depth==maxdepth)   //到达末尾
        {
            if(path.size()>0)
                res.push_back(path);
            return;
        }
        vector add=path;
        add.push_back(A[depth]);
        dfs(res,path,depth+1,maxdepth,A);
        dfs(res,add,depth+1,maxdepth,A);  //选或不选
        
    }
    
    
};

 

 

 

位操作思路:

对于一个集合,其中每一个元素或取或不取,那么对应一个二进制位的0或者1

组合起来的数的范围为 0~2的n次方-1                             

那么首先对原先数组排序,依次从2的n次方-1开始分析每个数的二进制各位右移 与 1做 按位与运算

需要判断数的低n位情况(分别对应右移0位  右移1位 右移2位...)所在位为1 那么对应下标处数插入到当前子集

vector> getSubsets2(vector A, int n)
{

    sort(A.begin(), A.end());//先排序
    vector> subsets;
    int num_subsets = (1 << n) - 1; //总的子集数量
    //对于 i=0 到 u=2的n次方-1   其每一个数的二进制位中为1对应A中一个数被选取
    for (int i = num_subsets; i > 0; i--)
    {
        vector subset;

        for (int j = n - 1; j >= 0; j--)
        {
            if ((i >> j) & 1 == 1)
                subset.push_back(A[j]);
        }
        subsets.push_back(subset);
    }
    return subsets;

}

 

 

 

 

 

 

 

 

你可能感兴趣的:(Leetcode)