打印集合中所有子集

 

 1 // PrintSubSet.cpp: 定义控制台应用程序的入口点。
 2 //
 3 /*
 4 打印集合中的所有子集,利用位运算
 5 */
 6 #include "stdafx.h"
 7 #include<iostream>
 8 
 9 using namespace std;
10 
11 template<typename T>
12 
13 void Print(T* array, int count, int index) {
14 	int mask = 1;
15 	for (int i = 0; i < count; i++) {
16 		if (mask&index) {
17 			//这里假设index是11110,代表原集合中第一个3没有出现,然后当mask(1)与index(11110)相与之后为0,所以不输出array[0],然后
18 			//mask左移一位变为:00010,与index(11110)相与之后结果为1,所以集合中对应的第二个元素26出现,所以打印array[1],依次类推
19 			cout << " "<<array[i];
20 		}
21 		mask <<=1;
22 	}
23 }
24 
25 
26 int main()
27 {
28 	int set[]={ 3,26,66,55,88 };
29 	//该集合中有5个元素,所以共有32个子集,从0---32,用二进制位表示,每一位代表集合中的某一对应元素是否出现在集合中
30 	//例如:11111代表集合中所有元素都出现在子集中,11110代表第一个元素:3未出现在子集中
31 	for (int index = 0; index < 32; index++) {
32 		Print(set, 5, index);
33 		cout << endl;
34 	}
35     return 0;
36 }

LeetCode中的代码:

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        int len=nums.size();
        int n=1<<len;//求出子集数,2的n次方
        vector<vector<int>> result;
        for(int index=0;index<n;index++){
            vector<int> temp=convertIntToSet(nums,index);
            result.push_back(temp);
        }
        return result;
    }
    
private:
    vector<int> convertIntToSet(vector<int> &nums, int k) {
            int index=0;
            vector<int> temp;
            for(int i=k;i>0;i>>=1){
                if(i&1==1){
                    temp.push_back(nums[index]);
                }
                index++;
            }
        return temp;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值