这一题让我想起了大二下学期数据结构的一个课程设计:随机发牌,也是同样运用到了二进制位的思路。这题中的排序就写了个简单的冒泡排序,一次性AC
class Solution {
public:
void Sort(vector<int>&S)
{
int num=S.size();
if(num<2)
return;
int i,j;
int flag;
for(i=1;i<num;i++)//i用来记录趟数,每一趟结束确定一个元素位置
{
flag=0;
for(j=1;j<num-i+1;j++)
{
if(S[j-1]>S[j])
{
S[j-1]=S[j-1]-S[j];
S[j]=S[j]+S[j-1];
S[j-1]=S[j]-S[j-1];
flag=1;
}
}
if(flag==0)
return;
}
}
vector<vector<int> > subsets(vector<int> &S) {
//若集合的元素个数是n,则它的幂集个数为2^n,于是可采用将元素排序在n个bit位上,遍历0~2^n,bit位上为1对应的数放入子集。题目要求序列不递减,则需要S排序
vector<vector<int>> result;
if(S.empty())//如果S为空,则在result加入空集,直接返回
{
result.push_back(S);
return result;
}
Sort(S);
int num=pow(2,S.size());
int i;
int j;
vector<int>element;
for(i=0;i<num;i++)
{
element.clear();
for(j=0;j<32;j++)
{
if(i&1<<j)
{
element.push_back(S[j]);
}
}
result.push_back(element);
}
return result;
}
};