全排列问题
这又是本蒟蒻再学习完全排列后写出的博客(手动狗头
洛谷题目传送门(P1706 全排列问题)
这个问题很简单,就是给出一个数列,求这个数列有多少种排列方法(最简单的排列组合种的排列)。
那要实现这个问题,肯定会在脑子中想到两种方法:万能的STL大法和手写DFS。
开局一条分割线,就问你服不服?(滑稽
关于STL,我们需要知道在<algorithm>
头文件中有这样一个神奇的东西:next_permutation
函数。
这个函数的原型可以理解为bool next_permutation(begin,end);
,其中begin是这个数组第一个数的下标,end是这个数组种最后一个数的下标。
这个函数就可以直接把我们输入的数组以全排列的形式输出出来,代码如下:
do{
for (int i=1;i<=n;i++){
printf("%5d",a[i]); // 输出a数组,宽度设置为5
}
puts("");
} while (next_permutation(a+1,a+1+n)); // 函数原型
当然,因为是STL大法,所以在时间和空间上会有所妥协。因此,生成next_permutation
函数的时间复杂度为O(n),一共有O(n!)个排列,总的时间复杂度可能为O(n*n!)。对于给出的例题,这个复杂度是完全可以接受的,但是对于其他题目可能需要设计合理的剪枝算法才可行。
下一步,我们就考虑手写搜索函数实现全排列。