题目:http://www.lintcode.com/zh-cn/problem/permutation-index/

排列序号

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

样例

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

思路:

1.直接暴力,利用c++中<algorithm>中的next_permutation()方法不断的寻找下一个全排列,直到相等为止!

2.首先观察一个全排列, 例如:95412 = X

  a.题目转换成按照字典序,这个全排列之前有多少个全排列。

  b.X的前面的所有全排列中,对于位置1上可以是5, 4, 1, 2任意一个数,而且对应的全排列的基数都是4!个。

  c.同理位置2, 3, 4, 5对应的基数分别是,3!,2!,1!,0!(0!==0)。

  d.得到该位置对应的基数后,那么该位置对应多少个可变数字?9所在位置对应的可变数字的个数为4,分别是5,4,1,2;

   5所在位置对应的可变数字是4,1,2;4所在位置对应的可变数字是1,2,;1所在位置的对应的可变数字:无。2所在位置

     对应可变数也是无。

  e.可以得到结论,X全排列某个位置上对应的可变数字的个数 == 这个数后面有多少个比它小的数的个数。

  f.为了得到某个数后面有多少个比它小的数的个数,我们采用折半插入排序(从后向前插入)。

class Solution {
public:/*** @param A an integer array* @return a long integer*/long long permutationIndex(vector<int>& A) {// Write your code here//阿欧,知道会超时,试一试还真tm超时// vector<int> permu(A.begin(), A.end());// sort(permu.begin(), permu.end());// int cnt = 0;// do{//     int i;//     for(i=0; i<A.size(); ++i)//         if(A[i]!=permu[i])//             break;//     ++cnt;//     if(i>=A.size()) break;// }while(next_permutation(permu.begin(), permu.end()));// return cnt;
        vector<int> a;int len = A.size();int cnt[len];cnt[len-1] = 0;a.push_back(A[len-1]);for(int i=len-2; i>=0; --i){//统计每个数后面有多少个比它小的数的个数vector<int>::iterator it = lower_bound(a.begin(), a.end(), A[i]);cnt[i] = it-a.begin();a.insert(it, A[i]);}long long ans=1, fac=1, c=1;//基数fac从1开始for(int i=len-2; i>=0; --i)ans += (fac*=c++)*cnt[i];return ans;}
};

转载于:https://www.cnblogs.com/hujunzheng/p/5020211.html

lintcode Permutation Index相关推荐

  1. Lintcode: Permutation Index

    Given a permutation which contains no repeated number, find its index in all the permutations of the ...

  2. 九章算法 第七到九章 预习笔记

    ********************第七章 基于排列.图的DFS预习笔记******************** 本章节的先修知识有: 全排列问题如何使用深度优先搜索来实现?和全子集问题的异同在哪 ...

  3. [OSDI 16] Wukong : 基于RDMA的高并发、快速的分布式RDF Graph Query系统

    今天要讲的文章是OSDI 2016年的一篇文章,Fast and Concurrent RDF Queries with RDMA-based Distributed Graph Exploratio ...

  4. R语言中的机器学习包

    转载自:http://blog.csdn.net/liuxincumt/article/details/7527917 Machine Learning & Statistical Learn ...

  5. r语言的MASS包干什么的_R语言常用包汇总

    转载于:https://blog.csdn.net/sinat_26917383/article/details/50651464?locationNum=2&fps=1 一.一些函数包大汇总 ...

  6. python递归实现全排列

    伪代码 来源:MIT. 6.0001 ProblemSet 4 Python代码 def get_permutations(sequence):if len(sequence) == 1:return ...

  7. LintCode 249. 统计前面比自己小的数的个数

    给定一个整数数组(下标由 0 到 n-1, n 表示数组的规模,取值范围由 0 到10000).对于数组中的每个 ai 元素,请计算 ai 前的数中比它小的元素的数量. 注意事项 We suggest ...

  8. UVa 11027 - Palindromic Permutation 回文串,组合加搜索

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=s ...

  9. Minimize the Permutation CodeForces - 1256(贪心)

    题意: q次询问,每次询问给你长度为n的排列,然后你每次可以选择一个位置i和i+1的数字进行交换.但是每个位置只能交换一次,问你反转若干次后,这个排列最小是多少? 题目: You are given ...

最新文章

  1. MIT联合波士顿咨询:全球21个行业,对话3000名高管,AI如何重塑商业形态? | 雷报
  2. android自定义进度条渐变色View,不使用任何图片资源
  3. notepad正则表达式替换_正则表达式装逼(实用)指南
  4. android int 首位值_Android应用视图的管理者Window
  5. 这些道理,未必正确,一定准确
  6. git revert
  7. 5个Python特性 越早知道越好的
  8. mysql sjis 校对乱码_MySQL乱码问题深层分析
  9. 【分布式WebSocket - 1】超详细!WebSocket协议详解
  10. jsp登录注册页面代码
  11. 手机测试兼容性的工具
  12. 学计算机到35岁后转行容易吗,本人已经35岁了,转行学IT风险是不是很大?
  13. Office协同办公讲解以及软件归纳
  14. centos7.6安装mysql数据库_CentOS7.6安装MYSQL8.0
  15. typora定制主题分享--绿豆沙背景主题+新night背景主题
  16. 联想E420麦克风没有声音的方案
  17. Python虽然很火,为啥找工作这么难
  18. IBM 的另一面http://www-31.ibm.com/innovation/cn/iter/2011v17/
  19. 转型下沉的51talk 能否在在线教育“造”出一个拼多多?
  20. VMware vSphere6.0 服务器虚拟化部署安装图解(转载火星小编)

热门文章

  1. python多线程同步与互斥_python多线程编程(3): 使用互斥锁同步线程
  2. 编译后没有taget文件夹_matconvnet安装、编译、配置
  3. java 快速读文件_java快速读取文件
  4. ElasticSearch 核心概念介绍_02
  5. MySQL8.0.26 开启bin_log日志 linux
  6. IntelliJ IDEA 2020 创建xml文件
  7. RabbitMQ的5种队列_Work模式_入门试炼_第5篇
  8. docker无法连接mysql镜像_关于Docker官方CentOS镜像无法启动mysqld的总结
  9. 找第一个只出现一次的字符_leetcode哈希表之第一个只出现一次的字符
  10. 设计java application程序_下面哪些步骤是Java Application程序的建立及运行的步骤( )...