题目:

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

样例

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

解题:

这个题目感觉很坑的。感觉这只有求出所有的排列,然后找出其对应的下标,但是怎么求出排列,在做Project Euler 时候碰到过,但是现在我又不会写了,那时候毕竟是抄别人的程序的。在geekviewpoint看到一种很厉害的解法,不需要求所有的排列,直接根据给的数组进行求解。

思路:

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开始的。

Java程序:

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++;
}
index = index + 1;
return index;
}
}

总耗时: 5756 ms

Python程序:

class Solution:
# @param {int[]} nums an integer array
# @return {long} a long integer
def permutationIndex(self, nums):
# Write your code here
index = 0
position = 2
factor = 1
numslen = len(nums)
for i in range((numslen-2),-1,-1):
successors = 0
for j in range((i+1),numslen):
if nums[i]>nums[j]:
successors+=1
index += successors*factor
factor*=position
position+=1
index +=1
return index

总耗时: 223 ms

同时,九章上面的程序还看不懂。。。

最新文章

  1. Android入门(十一)SQLite CURD
  2. MYSQL 下一些常用操作命令:新建用户、修改密码、修改登录host等
  3. uboot在s3c2440上的移植(1)
  4. JAVA里的String、Timestamp、Date相互转换(转)
  5. DLL 支持MFC 没有DLLMAIN函数
  6. Dorado事件的参数
  7. 【POJ 3623】 Best Cow Line, Gold (后缀数组)
  8. C# Hashtable中存入数组、List
  9. 【精品】Android游戏类源码大集合
  10. Android:源码环境下移植第三方的apk内置到ROM(System Image)中
  11. [LeetCode] Is Graph Bipartite? 是二分图么?
  12. 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分
  13. 使用limit查询的同时取得总的记录数:SQL_CALC_FOUND_ROWS和FOUND_ROWS()
  14. 安卓开发笔记(十九):异步消息处理机制实现更新软件UI
  15. springboot~mockMvc和asciidoctor生成基于TDD的API文档
  16. 2017-11-8&mdash;自动控制原理在软硬件方面上的应用和体现
  17. java常用的运算符
  18. Nikto
  19. django学习笔记-1
  20. Google Summer of Code礼包

热门文章

  1. Amazon S3 PHP Class Documentation
  2. 用Python作GIS之三:入口程序 - stargui.py
  3. COALESCE在SQL拼接中的大用途
  4. 关闭ios虚拟键盘的几种方法
  5. 阿里云mysql数据库恢复总结,mysql binlog日志解析
  6. [原]项目进阶 之 持续构建环境搭建(二)Nexus私服器
  7. 什么是XAML?
  8. android退出登陆后,清空之前所有的activity,进入登陆主界面
  9. Ubuntu 查看文件以及磁盘空间大小命令df
  10. IP地址格式控制