Lintcode190 Next Permutation II solution 题解

Posted foxli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lintcode190 Next Permutation II solution 题解相关的知识,希望对你有一定的参考价值。

【题目描述】

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。

如果没有下一个排列,则输出字典序最小的序列。

【题目链接】

www.lintcode.com/en/problem/next-permutation-ii/

【题目解析】

首先找到需要变大的那一位。因为求的是next permutation,所以增大位数要尽量靠右边同时增大的数值要尽量小。具体方法如下:

1) 从数组尾部开始,依次找每一位数离它最近的比它小的数的位置(即要变大的位置),记录下这个数和离它最近的比它小的数的index。每一位数得到的结果都和之前保存的结果做比较,保留index最大的要变大的位置和找到这个位置的数的位置,当要变大的位置相同时,保留数值较小的找到这个位置的数的位置。

2) 遍历完整个数组后,根据得到的结果,将要变大位置的数和找到这个位置的数交换位置,并返回变大的位置

3) 将数组从变大的位置的后一位开始从小到大排序即可。这里因为要求inplace所以用了bubble sort,若可以用额外空间还能用更快的排序方法。

【参考答案】

www.jiuzhang.com/solutions/next-permutation-ii/

以上是关于Lintcode190 Next Permutation II solution 题解的主要内容,如果未能解决你的问题,请参考以下文章

lintcode-medium-Next Permutation II

[Lintcode]52. Next Permutation

是否有类似 next_permutation 的函数,但用于重复排列?

LintCode之在O时间复杂度删除链表

lintcode 170旋转链表

LintCode链表题总结