Leetcode, Combinations
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void dfs(int n, int k, int start, int cur, vector<int> &path, vector<vector<int>> &res)
{
if (cur == k)
{
res.push_back(path);
}
for ( int i = start; i <= n; ++i )
{
path.push_back(i);
dfs(n, k, i + 1, cur + 1, path, res);
path.pop_back();
}
}
//递归 时间复杂度O(n!),空间复杂度O(n)
vector<vector<int>> solution(int n, int k)
{
vector<vector<int>> res;
vector<int> path;
dfs(n, k, 1, 0, path, res);
return res;
}
//递归 时间复杂度O((n-k)!),空间复杂度O(n)
vector<vector<int>> solution1(int n, int k)
{
vector<vector<int>> res;
vector<bool> select(n, false);
fill_n(select.begin(), k, true);
do
{
vector<int> tmp(k);
for (int i = 0, index = 0; i < n; ++i)
{
if (select[i])
tmp[index++] = i + 1;
}
res.push_back(tmp);
} while (prev_permutation(select.begin(), select.end()));
return res;
}
int main()
{
//auto res = solution(4, 2);
#if 0
{
[1, 2],
[1, 3],
[1, 4],
[2, 3],
[2, 4],
[3, 4]
}
#endif // 0
auto res = solution1(4, 2);
#if 0
{
[1, 2],
[1, 3],
[1, 4],
[2, 3],
[2, 4],
[3, 4]
}
#endif // 0
return 0;
}