lintcode Permutation Index

简介:

 题目: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;
    }
};
复制代码

 

目录
相关文章
|
开发工具 数据安全/隐私保护 Windows
linphone安装和使用教程
<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> 刚刚搞通linphone,终于能连上sip.linphone.org了,中间过程太心酸了。</p> <p style="color:rgb(51,51,51); font-family:Arial; font-size
9757 0
|
消息中间件 运维 监控
使用日志服务LogHub替换Kafka
前几天有客户问到,云上有什么服务可以替换Kafka? 怀着程序员的一丝小小的骄傲回复:日志服务(原SLS)下LogHub功能可以完全替代Kafka等产品,并且在性能、易用性和稳定性上更佳。 但客户将信将疑,于是花了一天时间整理一篇文章,简单从各个角度解释下为何建议用户从自搭Kafka换成
31773 12
|
分布式计算 大数据 Java
Hadoop2.6.0子项目hadoop-mapreduce-examples的简单介绍
学习Hadoop的同学们,一定知道如果运行Hadoop自带的各种例子。hadoop-mapreduce-examples项目中还提供了这些例子,本文就其中例子的执行方式进行分析。看看它能否让我们学习mapreduce编程变得更加容易。
5107 0
|
存储 数据处理 云计算
阿里云邮箱怎么注册
www.jinlehao.com 金乐豪
9702 0
|
XML 前端开发 Java
|
JavaScript