(最优解)阿里笔试题请设计一个算法,在满足质因数仅为3,5,7或其组合的数中,找出第K大的数。比如K=1,2,3时,分别应返回3,5,7。要求算法时间复杂度最优。

来源:互联网 发布:大数据采集平台 编辑:程序博客网 时间:2024/05/21 06:34

//2015年4月1日

先贴出网上流传的解答:(非最优的)

我们可以用3个队列来维护这些数。第1个队列负责乘以3,第2个队列负责乘以5, 第3个队列负责乘以7。算法描述如下:
1. 初始化结果res=1和队列q3,q5,q7
2. 分别往q3,q5,q7插入1*3,1*5,1*7
3. 求出三个队列的队头元素中最小的那个x,更新结果res=x
4. 如果x在:
    q3中,那么从q3中移除x,并向q3,q5,q7插入3*x,5*x,7*x
    q5中,那么从q5中移除x,并向q5,q7插入5*x,7*x
    q7中,那么从q7中移除x,并向q7插入7*x
5. 重复步骤3-5,直到找到第k个满足条件的数
注意,当x出现在q5中,我们没往q3中插入3*x,那是因为这个数在q5中已经插入过了。


其实当我们第一次看到这个题,都会想到K是不是一个可以求解的数。

但马上困难就出现了,我们不知道如何为3^x,5^y,7^z排序。

对数学较敏锐的人会马上想出方法:

5^y=3^(log3(5)*y)

7^z=3^(log3(7)*z)

这样一来:
a(n)=3^x*5^y*7^z=3^(x+log3(5)*y+log3(7)*z)

就只需要对x+log3(5)*y+log3(7)*z的第K大的数进行求解。

因为这里x,y,z之间是固定比例,很容易做。


1 0
原创粉丝点击