题意:找到一个集合所有不一样的子集。
思路:暴力搜索。排序之后判断两个集合是否一样。
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
int mark = pow(2.0, nums.size());
vector<int> in;
int iniin = 1;
for(int i = 0; i < nums.size(); ++ i) {
in.push_back(iniin);
iniin <<= 1;
}
int ini = 0;
vector<vector<int>> re;
while(ini ^ mark) {
vector<int> tempre;
for(int i = 0; i < nums.size(); ++ i) {
if(ini & in[i]) tempre.push_back(nums[i]);
}
ini ++;
re.push_back(tempre);
}
vector<vector<int>> myre;
for(int i = 0; i < re.size(); ++ i) {
bool f = false;
std::sort(re[i].begin(), re[i].end());
for(int j = 0; j < myre.size(); ++ j) if(isSame(myre[j], re[i])) f = true;
if(f == false) myre.push_back(re[i]);
}
return myre;
}
bool isSame(vector<int> a, vector<int> b) {
if(a.size() != b.size()) return false;
for(int i = 0; i < a.size(); ++ i) {
if(a[i] != b[i]) return false;
}
return true;
}
};
另一种方法是顺序插入,在原有的集合上出入新的元素得到新的集合,这是一种处理排列组合的常用方法。
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> re = {{}};
std::sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size();) {
int count = 0;
while(i + count < nums.size() && nums[i] == nums[i + count]) count ++;
vector<int> temp;
int size = re.size();
for(int j = 0; j < size; ++ j) {
temp = re[j];
for(int k = 0; k < count; ++ k) {
temp.push_back(nums[i]);
re.push_back(temp);
}
}
i += count;
}
return re;
}
};