九章算法官网-原文网址
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)。
时间: 2024-10-08 14:12:52