一:c++ STL
next_permutation和prev_permutation
bool next_permutation(iterator start,iterator end)
next_permutation是求字典序的下一个排列,prev_permutation是求字典序的上一个排列。
如果当前序列存在下一个序列,那么next_permutation返回的是ture,否则返回的是false。
如果当前序列存在上一个序列,那么prev_permutation返回的是ture,否则返回的是false。
注意:1 2 3 4 5 的prev_permutation会返回false,但是序列会被设置成5 4 3 2 1。像是一个循环
二:算法思想
有n个数,当前序列为a,求a后第m个序列?(下标为1,2,3,,,n)
while(m--){
int i,ii;
for(i=n-1,ii=n;i>=1;i--,i--){//第一步:从后面开始找到第一个a[i]>a[i+1]
if(a[i]>a[ii]) break;
}
for(int j=n;;j--){
if(a[j]》a[i]){
swap(a[i],a[j]);//第二部:从后面找到第一个比a[i]大的数,交换a[i] a[j]
break;
}
}
reverse(a+1+ii,a+1+n);//第三步:反转ii-n之间的序列
}