所以如果我正确地阅读这个问题,你想要找到第k个排列,最好不要使用BigInteger,只要k不够大,不需要一个BigInteger.

如果我们看序列

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

我们可以重写它,以便每个位置的数字是到目前为止还没有出现的数字列表的索引:

0 0 0

0 1 0

1 0 0

1 1 0

2 0 0

2 1 0

所以例如“2,0”表示从列表“1,3”开始,然后取第三个(因为我们从零索引),这是一个3,然后取第一个剩余的数字“ 1,2“是1,然后是第一个剩余的数字,即”2“.所以它产生“3,1,2”.

要生成这些索引,从右到左,将k除以1!最右边的两个地方,然后2!然后3!然后4!等等,然后用该位置的可能索引的数量模拟结果,最右边为1,最右侧为2等.您不必每次都计算因子,因为您可以保留正在运行的产品.

一旦k除以阶乘为零,你就可以突破循环,所以你只需要计算阶乘,直到大致大小的k乘以k除以阶乘的最后一个地方是非零.如果k太大,则需要切换到BigInteger.

一旦你有了索引,用它来产生排列就是非常简单的.

代码(k从0开始,所以找到第一遍0,不是1):

static public void findPermutation(int n,int k)

{

int[] numbers = new int[n];

int[] indices = new int[n];

// initialise the numbers 1,3...

for (int i = 0; i < n; i++)

numbers[i] = i + 1;

int divisor = 1;

for (int place = 1; place <= n; place++)

{

if((k / divisor) == 0)

break; // all the remaining indices will be zero

// compute the index at that place:

indices[n-place] = (k / divisor) % place;

divisor *= place;

}

// print out the indices:

// System.out.println(Arrays.toString(indices));

// permute the numbers array according to the indices:

for (int i = 0; i < n; i++)

{

int index = indices[i] + i;

// take the element at index and place it at i,moving the rest up

if(index != i)

{

int temp = numbers[index];

for(int j = index; j > i; j--)

numbers[j] = numbers[j-1];

numbers[i] = temp;

}

}

// print out the permutation:

System.out.println(Arrays.toString(numbers));

}

[1,3]

[1,2]

[2,3]

[2,1]

[3,2]

[3,1]

n = 100的10000000次排列:

[1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,92,98,96,90,91,100,94,97,95,99,93 ]

java 返回第k小的数_java – 给定n和k,返回第k个置换序列相关推荐

  1. 第k小的数(二分、partition)

    题目 要求以最快效率求出一个乱序数组中的第k小的数 例如:{1,6,7,2,3} 第k=3小的数为3 解法 如何找次序?利用partition分界左边是小数右边是大数,那么就能知道partition的 ...

  2. python递归算法 电影院票价问题_算法课堂实验报告(二)——python递归和分治(第k小的数,大数乘法问题)...

    python实现递归和分治 一.开发环境 开发工具:jupyter notebook 并使用vscode,cmd命令行工具协助编程测试算法,并使用codeblocks辅助编写C++程序 编程语言:py ...

  3. html5数组查找第二大数,2021-06-29:在两个都有序的数组中找整体第K小的数。

    2021-06-29:在两个都有序的数组中找整体第K小的数. 福大大 答案2021-06-29: 1.A和B长度不等的时候,需要把A和B的长度变成相等. A是短数组,B是长数组. 第k小的数,k从1开 ...

  4. 面试题:找两个有序数组所有数第K小的数

    给定两个有序数组arr1和arr2,再给定一个整数k,返回两个数组中所有数中第k小的数.要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M, N}) ) 例如: ...

  5. 7-1 找第k小的数(反思),a++和++a的区别,运算符优先级,递归分制思想

    作者 陈晓梅 单位 广东外语外贸大学 设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数. 提示 函数int partition(int a[],i ...

  6. 在两个已经排好序的数组里找出第K小的数

    前言: 这道题是一道非常常见的面试题,也是一道能够考察一个人的编程能力和算法的一道题.如果要求复杂度为 O(k), 是比较容易做出来的,但是,一般来讲,面试官要求给出更低复杂度的算法.网上有很多不同的 ...

  7. 第K小的数BFPRT算法

    介绍 BFPRT是解决求一个数组中第K小的数的算法,可以时间O(N)的时间复杂度,而使用排序求第K小的数的算法的时间复杂度为O(NlogN),因此BFPRT算法更加高效 思想 (1)分组:将原数组每五 ...

  8. 7-1 找第k小的数 (20 分)

    设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数. 提示:函数int partition(int a[],int left,int right)的 ...

  9. 算法导论:快速找出无序数组中第k小的数

    题目描述: 给定一个无序整数数组,返回这个数组中第k小的数. 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1). ...

最新文章

  1. 《C语言及程序设计》实践项目——结构体应用
  2. 线性代数思维导图_线性代数入门级思维导图
  3. eof怎么结束输入_西门子S71500数字量输入模块如何编址?
  4. windows下使用DOS命令删除大文件
  5. 自己关于pytorch transfomers 的一个误区
  6. Java多线程多个线程之间共享数据
  7. Deep Learning 和 Knowledge Graph howto
  8. Error while executing: am start -n错误解决方案
  9. 条形码扫描仪行业调研报告 - 市场现状分析与发展前景预测
  10. MRI脑影像分析从哲学到技术:一文搞懂VBM预处理基本原理(全网最详细解析)
  11. python大括号_python大括号 Python中小括号中括号大括号怎么用?
  12. 或许再过两年,ASML将可以自由给中国供应EUV光刻机
  13. android落花效果 字体渐变,落花有情 亲花有趣
  14. 2021秋招笔试(1)_乐鑫
  15. stm32cubeMX学习十八、SD卡虚拟U盘实验
  16. 2021年焊工(初级)考试报名及焊工(初级)免费试题
  17. IP反查网站,ip反查接口,旁站查询接口大全,通过IP查域名汇总:
  18. 郎平,你回来会毁了中国女排!
  19. Ubuntu17.10解决安装完网易云音乐无法打开
  20. 才22岁!这位00后博士拟任职985高校!

热门文章

  1. 语言prodave以太网通讯_工业以太网通讯
  2. python调用arcpy函数_python笔记之ArcPy函数列表
  3. shiro包_Shiro--从一个简单的 Realm 开始权限认证
  4. python中map函数返回值类型_Python函数精解:map函数
  5. 5h Oralcle进阶直播课,限时免费报名,手慢无!
  6. 查看SQL执行计划的方法及优劣
  7. 【警惕】大量未修复WebLogic WSAT组件RCE漏洞的主机被挖矿程序攻击
  8. 容器化时代到来!跳转机分配问题终于“有救”了
  9. MongoDB 事务,复制和分片的关系
  10. 无码系列-6 数据缓存设计经验谈