当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

【Everyday】(5)排列序号 - Everyday

作者:小梦 来源: 网络 时间: 2024-02-27 阅读:

问题描述

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

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

解题思路

给出一个数组,数组中的元素全部都是不相同的,首先要解决的是对该数组中的序列进行全排列,然后按照字典排序后的位置对其编号,然后再和最开始的进行一个比对,确定这是第一个,首先想到的是全排列规则,如果按照复杂度最高的,则是通过阶乘获得其所有的序列,然后根据我们的序列和其比对,确定其编号是多少,这肯定是不符号要求的,其中肯定是含有某种规律,需要我们通过寻找规律来有效的降低复杂度来解决问题,想象阶乘的结构,某一个位置的序号应该是后面比其小的数字,减去当前位,将后面的位数进行全排列后加1得到,按照这种思路我们得到一个o(n^2)复杂度的算法。

代码实现

public long permutationIndex(int[] A) {        // Write your code here        long number = 0;        if(A==null||A.length==0)return number;        for(int i=0;i<A.length-1; i++){int tmp=0;for(int j=i+1;j<A.length; j++){    if(A[j]<A[i])        tmp++;}number+=tmp*getFacResult(A.length-i-1);        }        return ++number;    }    public long getFacResult(int n){        long result=1;        while(n>=1){result = result*n;n--;        }        return result;    }

优化与启发

1.通过几个题目的锻炼,总结出来的规律是对于问题进行仔细的分析,找出一个普遍的规律,然后将这个规律通过编程进行表达。
2.在这里出现了一个问题是对于阶乘的值开始通过int表达,然后出现了错误,转为long后问题解决,这个需要在编程中要考虑到了。

热点阅读

网友最爱