程序员面试金典

时间:2022-11-05 00:39:03

程序员面试金典--集合的子集

 

题目描述

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

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

测试样例:
[123,456,789]
返回:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}

 

看到牛客网的discuss上的, 使用二进制,二进制每次减去1, 则其二进制数的字典序降一。( 二进制逐次减一,就得到一串字典序(从高到低的))

 

 

class Subset {
public:

vector<vector<int> > getSubsets(vector<int> A, int n) {
// write code here
sort(A.begin(), A.end());

int num = 1 << n;

vector<vector<int> > ans;

for(int i= num - 1; i>0; --i) {
vector<int> tmp;

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

ans.push_back(tmp);
}

return ans;
}
};