前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LintCode 排列序号题目分析代码

LintCode 排列序号题目分析代码

作者头像
desperate633
发布2018-08-22 11:06:29
5120
发布2018-08-22 11:06:29
举报
文章被收录于专栏:desperate633

题目

给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号。其中,编号从1开始。 样例 例如,排列 [1,2,4]是第 1个排列。

分析

1.对于四位数:4213 = 4100+2100+110+3 2.4个数的排列有4!种。当我们知道第一位数的时候,还有3!种方式,当知道第二位数时候还有2!种方式,当知道第三位数的时候还有1!种方式,前面三位数都确定的时候,最后一位也确定了。<这里是按照高位到地位的顺序> 3.对4个数的排列,各位的权值为:3!,2!,1!,0!。第一位之后的数小于第一位的个数是x,第二位之后的数小于第二位的个数是y,第三位之后的数小于第三的个数是z,第四位之后的数小于第四位的个数是w,则abcd排列所在的序列号:index = x3!+y2!+z1!,<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 = 22!+11! = 5 这里的下标是从0开始的。

代码

代码语言:javascript
复制
public class Solution {
    /**
     * @param A an integer array
     * @return a long integer
     */
    public long permutationIndex(int[] permutation) {
        // Write your code here
        long index = 0;
  long position = 2;// position 1 is paired with factor 0 and so is skipped
  long factor = 1;
  for (int p = permutation.length - 2; p >= 0; p--) {
    long successors = 0;
    for (int q = p + 1; q < permutation.length; q++) {
      if (permutation[p] > permutation[q]) {
        successors++;
      }
    }
    index += (successors * factor);
    factor *= position;
    position++;
  }
  return index+1;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.12.17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 分析
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档