不是记录最佳题解,只是记录最笨办法用到的,用迭代方式求排列
// 从N个元素中 选择numSelect个元素,不重复
// eg: func(5, 3) == 一共10种排列结果
vector<set<int>> func(int N, int numSelect)
{
vector<set<int>> ret;
vector<int> vec;
vec.reserve(numSelect);
int stackDepth = 1;
vec.push_back(0);
while (true) {
if (vec.empty()) {
break;
}
if (vec.front() >= (N - numSelect + 1)) {
break;
}
if (stackDepth < numSelect) {
if (vec.back() + 1 < N) {
vec.push_back(vec.back() + 1);
++stackDepth;
} else {
--stackDepth;
vec.pop_back();
++vec.back();
}
continue;
}
ret.emplace_back(vec.begin(), vec.end());
for (int i = vec.back() + 1; i < N; ++i) {
auto &back = vec.back();
back = i;
ret.emplace_back(vec.begin(), vec.end());
}
--stackDepth;
vec.pop_back();
if (vec.empty()) {
break;
}
++vec.back();
}
return ret;
}