按字典顺序查找排列列表中给定排列的索引
这是一道面试题。假设有一个按字典顺序排列的排列列表。例如,123
、132
、213
、231
、312
、>321
。给定一个排列,在这样的列表中找到它的索引。例如,排列213
的索引是2(如果我们从0开始)。
简单地说,我们可以使用 next_permutation 算法按字典顺序生成下一个排列,但这会导致 O(N!) 解决方案,这显然是不可行的。还有更好的解决办法吗?
Possible Duplicate:
Given a string and permutation of the string. Find the index of this permuted string in the sorted list of the permutations of the string.
This is an interview question. Let there is a list of permutations in lexicographic order. For example, 123
, 132
, 213
, 231
, 312
, 321
. Given a permutation find its index in such a list. For example, the index of permutation 213
is 2 (if we start from 0).
Trivially, we can use a next_permutation
algorithm to generate a next permutation in lexicographic order, but it leads to O(N!) solution, which is obviously non-feasible. Is there any better solution?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我想到了这个解决方案(但我还没有测试过)。
第一个数字的范围是 1 到 N,因此您可以从第一个数字得出您的排列是否位于哪个大小为 (N-1) 的块中!
然后您可以递归地将其应用于下一个数字(这是 (N-1)! 排列之一)。
因此,使用任意 N,您可以执行以下算法:
在您的情况下:
因此该算法是 O(N^2)。
This solution came into my mind (but I didn't test it yet).
The first digit is from range 1 to N, thus you can derive from the first digit whether your permutation is in which block of size (N-1)!
Then you can recursively apply this to the next digits (which is one of (N-1)! permutations).
So with an arbitrary N you can do the following algorithm:
In your case:
Thus this algorithm is O(N^2).
将排列中数字中第一位数字的索引乘以
(n-1)!
,并添加剩余排列的索引。例如,
2
的索引为1
,而13
的索引为0
,因此结果为1 * (3-1)! + 0 = 1 * 2 = 2。
Multiply the index of the first digit among the digits in the permutation by
(n-1)!
and add the index of the remaining permutation.For example,
2
has index1
, and the index of13
is0
, so the result is1 * (3-1)! + 0 = 1 * 2 = 2
.N!
的子范围N!
在C中使用递归它会是这样的
In C using recursion it will be something like this