31.下一排列

2019-05-14  本文已影响0人  New_Learner

给定一个数列,寻找按字典序排列比它大的下一数列,如果不存在比它大的数列,则寻找字典序最小的数列。

考虑两种情况:1.逆序数组不存在字典序比它大的情况,这时候返回升序数组即可。2.当不是逆序数组时呢?我们必然能找到一个顺序对,如 5 4 2 3 1 中 2 和 3 就是顺序的,它的下一排列是 5 4 3 1 2 。以这个例子为例,将顺序对中较大的数字放于较小的位置,并对接下来的数组做排序。如果存在多个顺序对?如 5 1 2 3 4 ,这时候要考虑哪个顺序对的前者最远, 这里最远的顺序对是 3 4 所以下一排列 5 1 2 4 3 ,再考虑如果前者一样呢, 如 5 4 1 2 3 ,这个例子里 1 2 和 1 3 都是顺序对,那就考虑后者较小的那个,以 1 2 来重排列。

总结:关键在于找顺序对,使用两个指针,first 用于指向顺序对的开头, second 用于指向比first 大的较小值。

找顺序对的主要思路是先寻找 first 只要后者大于前者就行。一直迭代自然会指向较后的顺序对。

上一篇下一篇

猜你喜欢

热点阅读