显然,直接用STL中的next_permutation(p,p+n)可以很快速得出下一个排列(见算法竞赛入门经典(第二版) P187)
但这道题的重点是理解怎么求下一个排列的方法,
下面是常规方法求解思路
设P是一个排列串:P = s[1]s[2]...s[n] = s[1]...s[j]...s[k]...s[n]
1)从当前排列串的右端开始,找出第一个比右边数字小的数字的序号j
(j从左端开始计算),即 j=max{i|s[i]<s[i+1]};
2)在s[j]的右边的数字中,找出所有比s[j]大的数中最小的数字s[k],
即 k=max{i|s[i]>s[j]}
(对s[j]右边数来说,从右至左是递增的,因此k是所有大于s[j]的数字中序号最大者,
序号虽最大但s[k]是处于s[j]右边且比s[j]大的数中的最小者);
3)交换s[j]和s[k];
4)再将s[j+1]...s[k-1]s[k]s[k+1]...s[n]倒转得到排列
P' = s[1]s[2]...s[j]s[n]...s[k+1]s[k]s[k-1]...s[j+1],
这里P'就是排列P的下一个排列。
简单来说,就是对于给定的一个数,首先从右边找到第一个相邻“有序对”(这个“有序对”
的定义是就是满足s[i]<s[i+1]最右边对)。
现假设下一个要找的数比这个数大,且中间没有一个数比前者大、比后者小。然后再重新从
右边起找出第一个比那个"有序对"的较小者要大的数,交换他们,再将那个较小