Leetcode, Subsets2
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
void dfs(const vector<int> &vec, vector<int> &path, vector<int>::iterator start, vector<vector<int>> &res)
{
res.push_back(path);
for ( auto i = start; i < vec.end(); ++i )
{
//3 [] 1,2,2
//2. [1] 2,2
//1. [1,2] 2
if(i != start && *i == *(i - 1))
continue;
path.push_back(*i);
dfs(vec, path, i + 1, res);
path.pop_back();
}
}
//递归 时间复杂度O(n^2),空间复杂度O(n)
vector<vector<int>> solution(vector<int> &vec)
{
sort(vec.begin(), vec.end());
vector<vector<int>> res;
vector<int> path;
dfs(vec, path, vec.begin(), res);
return res;
}
//迭代 时间复杂度O(2^n),空间复杂度O(1)
vector<vector<int>> solution1(vector<int> &vec)
{
sort(vec.begin(), vec.end());
vector<vector<int>> res(1);
size_t pre_size = 0;
for ( size_t i = 0; i < vec.size(); ++i )
{
const size_t size = res.size();
for ( size_t j = 0; j < size; ++j )
{
//i = 0 [1]
//vec[i] != vec[i - 1] 适用vec = {1,2,3}
//j >= pre_size 避免[2] [1,2]重复
if (i == 0 || vec[i] != vec[i - 1] || j >= pre_size)
{
res.push_back(res[j]);
res.back().push_back(vec[i]);
}
}
pre_size = size;
}
return res;
}
//二进制法 时间复杂度O(2^n),空间复杂度O(1)
vector<vector<int>> solution2(vector<int> &vec)
{
sort(vec.begin(), vec.end());
set<vector<int>> res; //set去重
const size_t n = vec.size();
vector<int> v;
for ( size_t i = 0; i < 1U << n; ++i )
{
for ( size_t j = 0; j < n; ++j )
{
if (i & 1 << j)
v.push_back(vec[j]);
}
res.insert(v);
v.clear();
}
vector<vector<int>> real_result;
copy(res.begin(), res.end(), back_inserter(real_result));
return real_result;
}
int main()
{
vector<int> vec = { 1,2,2 };
//auto res = solution(vec);
#if 0
solution::res =
[
[],
[1],
[1, 2],
[1, 2, 2],
[2],
[2, 2]
]
#endif // 0
//auto res = solution1(vec);
#if 0
solution1 res =
[
[],
[1],
[2],
[1, 2],
[2, 2],
[1, 2, 2],
]
#endif // 0
auto res = solution2(vec);
#if 0
solution2 res =
[
[],
[1],
[1, 2],
[1, 2, 2],
[2],
[2, 2]
]
#endif // 0
return 0;
}