LeetCode:Subsets

这一题让我想起了大二下学期数据结构的一个课程设计:随机发牌,也是同样运用到了二进制位的思路。这题中的排序就写了个简单的冒泡排序,一次性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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值