lintcode Permutation Index 排列序号

灰太狼 2022-07-15 02:37 252阅读 0赞

排列序号

  • 描述
  • 笔记
  • 数据
  • 评测

给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号。其中,编号从1开始。

您在真实的面试中是否遇到过这个题?

Yes

样例

例如,排列 [1,2,4] 是第 1 个排列。

参考:http://www.mamicode.com/info-detail-1079668.html

思路:

1.对于四位数:4213 = 4*100+2*100+1*10+3

2.4个数的排列有4!种。当我们知道第一位数的时候,还有3!种方式,当知道第二位数时候还有2!种方式,当知道第三位数的时候还有1!种方式,前面三位数都确定的时候,最后一位也确定了。<这里是按照高位到地位的顺序>

3.对4个数的排列,各位的权值为:3!,2!,1!,0!。第一位之后的数小于第一位的个数是x,第二位之后的数小于第二位的个数是y,第三位之后的数小于第三的个数是z,第四位之后的数小于第四位的个数是w,则abcd排列所在的序列号:index = x*3!+y*2!+z*1!,<0!=0>

在数的排列中,小数在前面,大数在后面,所以考虑该位数之后的数小于该为的数的个数,这里我自己理解的也不是很透,就这样。

4.例如 4213;x= 3,y = 1,z=0,index = 18+2=20

123;x = 0,y=0,index = 0

321;x= 2,y=1,index = 2*2!+1*1! = 5

这里的下标是从0开始的。

  1. public long permutationIndex(int[] permutation) {
  2. // Write your code here
  3. long index = 0;
  4. long position = 2;// position 1 is paired with factor 0 and so is
  5. // skipped
  6. long factor = 1;
  7. for (int p = permutation.length - 2; p >= 0; p--) {
  8. long successors = 0;
  9. for (int q = p + 1; q < permutation.length; q++) {
  10. if (permutation[p] > permutation[q]) {
  11. successors++;
  12. }
  13. }
  14. index += (successors * factor);
  15. factor *= position;
  16. position++;
  17. }
  18. index = index + 1;
  19. return index;
  20. }

发表评论

表情:
评论列表 (有 0 条评论,252人围观)

还没有评论,来说两句吧...

相关阅读

    相关 lintcode排列问题

    1/ 子集 给定一个含不同整数的集合,返回其所有的子集 注意事项 子集中的元素排列必须是非降序的,解集必须不包含重复的子集 您在真实的面试中是否遇到过这个题