STL:next_permutation (UVaOJ 146)

STL中,next_permutation( first, last ) 可以把[ first, last)中的序列,变成下一个全排列。

如果序列没有下一个全排列,就返回false,否则返回true。

至于全排列是什么,可以查阅百度百科。(传送门


而 next_permutation( ) 对我们的序列做了什么呢?


将一个全排列变成下一个全排列的时候,我们可以这样做。

从后往前找,找到一个元素Ai,发现这个元素后面有比他大的元素,其中最小的为Aj。

交换Ai和Aj两个元素的位置,一定可以得到一个比原来大的全排列。

我们要找的下一个,就是比原来全排列只大1的全排列。

我们可以把元素Ai后面的序列排序。

这样,我们就可以得到比原全排列大的所有全排列中最小的那个。

那么就是我们要的,只比原来全排列大1的全排列。

如果找不到这样Ai,就不存在下一个全排列。


而 next_permutation( ) 做的是这样的事。

从后往前找,找到两个相邻的元素 Ai 和 Aii 满足 Ai < Aii。

然后再次从后往前找,找到第一个大于Ai的元素Aj。

交换Ai和Aj的位置,然后讲Aii及Aii后面的元素逆向排列。

我们可以模拟这个过程,发现它的做法和我们的做法差不多,并且更高效。


同时,在STL还有另一个函数 prev_permutation( ),它正好和 next_permutation( ) 相反,是求前一个全排列。


还有要注意的是,当 prev_permutation( ) 和 next_permutation( ) 返回false的时候,序列依然会被改变。

并且会发生回绕,即像 int 一样,最后一个的后面一个,会是第一个,第一个的前面一个会是最后一个。



参考资料:《STL源码剖析》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值