码迷,mamicode.com
首页 > 编程语言 > 详细

九章算法面试题64 找第k大的特殊数

时间:2015-05-13 10:26:50      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:分治   leetcode   九章算法   lintcode   面试题   

九章算法官网-原文网址

http://www.jiuzhang.com/problem/65/


题目

有一种特殊的数,它的素数因子只有可能是3,5,7,不可能是其他的素数, 我们把这种数从小到大排序,得到3,5, 7, 9, 15 ... 现在我们要求其中第K大得数是多少,比如其中第4大的数是9。


在线测试本题

http://lintcode.com/en/problem/kth-prime-number/


解答


我们所要求的元素如果除以3,5,7然后排序过后可以分成为三类元素。

a. 1×3, 3×3, 5×3, 7×3,9×3, …

b. 1×5, 3×5, 5×5, 7×5, 9×5, …

c. 1×7, 3×7, 5×7, 7×7, 9×7,…

最后其实相当于是把三个数列merge到一起,然后找出这个merge数列的第k大,并且分解后相乘的两个数中的第一个元素刚好是我们所求的数列,然后第二个数是3,5,7。 我们知道merge三个数列的算法是用三个指针,所以我们可以借鉴这种merge的做法 。我们设三个指针p3,p5,p7,最开始p3=0,p5=0,p7=0, 然后用一个数组a记录我们要求的数列。最开始数列第一个元素是a[0]=1 ,然后每次选取(a[p3]*3,a[p5]*5, a[p7]*7)中最小的元素作为下一个元素插入到数组a中,如果最小的元素是p3,那么p3指向下一个元素p3++, 同理如果是p5, p5++ , 如果是p7那么p7++ , 所以第k步的时候,a[k]就存储了我们所求的元素。 这样最后这道题的时间复杂度就是O(n)。


九章算法面试题64 找第k大的特殊数

标签:分治   leetcode   九章算法   lintcode   面试题   

原文地址:http://blog.csdn.net/jiuzhang_ninechapter/article/details/45681901

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!