应用STL中函数next_permutation的原理解题
说明:以下所说的数组间大小指的是字典排序大小。
一、解题思路
1.通过每次都找到当前数组的下一个更大的排列(当当前数组为最大时,下一个排列循环为最小的数组),进行k次该步骤就能找到下k个大的数组了。
二、解题方法
1.从数组最后一位开始找非递增的两个数,假设该前后两个数的下标分别为i,j(当没有时说明数组为最大,标记为从新循环)。
2.再次从数组最后一位开始找比a[i]大的数,并与a[i]交换位置。
3.从a[j]开始到最后的数reverse一下就得到了下一个更大的数组。
三、代码实现
#include<cstdio>
int n, k;
int a[1048];
int findIncrease()//步骤1找递增
{
int i;
for(i = n-1; i >= 1; i--)
if(a[i] > a[i-1]) return i-1;
return -1;
}
void Swap(int l, int r)//步骤2交换位置
{
int t;
t = a[l], a[l] = a[r], a[r] = t;
}
void Reverse(int l, int r)//步骤3旋转
{
for(; l < r; l++, r--)
Swap(l, r);
}
void nextPermutation()
{
int substitution;
substitution = findIncrease();
if(substitution == -1)
{
substitution = 0;
}
else
{
int i;
for(i = n-1; i > substitution; i--)
if(a[i] > a[substitution]) break;
Swap(substitution, i);
substitution++;
}
Reverse(substitution, n-1);
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &k);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
for(int i = 0; i < k; i++)
nextPermutation();
for(int i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
}
return 0;
}