不一样的「下一个更大元素」

31. 下一个排列

556. 下一个更大元素 III

 

有一类题目是让我们求元素左边或者右边下一个更大的元素,这类题目需要用到单调栈,详情可见 单调栈

而今天的「下一个更大元素」题目是让我们重新排列数字,找到大于n的最小整数,和「下一个排列」很像,题目详情可见 下一个排列

下一个排列

题目详情可见 下一个排列

给定若干个数字,将其组合为一个整数。如何将这些数字重新排列,以得到下一个更大的整数。如123下一个更大的数为 132。如果没有更大的整数,则输出最小的整数

1,2,3 为例,其排列依次为:123 -> 132 -> 213 -> 231 -> 312 -> 321,该次序也符合从小到大的关系

算法推导

如何得到这样的排列顺序?这是本文的重点。我们可以这样来分析:

以上就是求「下一个排列」的分析过程

可视化

以求12385764的下一个排列为例:

1

首先从后向前查找第一个相邻升序的元素对(i, j)。这里i = 4j = 5,对应的值为57

2

然后我们从j = 5; val = 7开始排序,如绿色部分所示:

3

在绿色部分中从小到大开始找第一个比i = 4; val = 5大的元素,并交换,即值56交换:

 

4

因此:12385764(橙色部分) 的下一个排列就是 12386457 (绿色部分)

5

算法实现

下一个更大元素 III

题目详情可见 下一个更大元素 III

过程基本上和上个题目分析一致,完整代码如下: