给出一个数字k和一组有序数字。查找集合中是否有任何数字除以此数字。
例如,如果k = 8,并且设置为{3,4,5},则4将除以8. 4是答案。
最坏情况解决方案是O(n)。
我们可以做得更好吗?
答案 0 :(得分:2)
如何对数字进行因式分解(8给出4 2 1)然后搜索给定集合中的因子?您可以使用集合交叉点或二分法搜索因子列表。我认为它会为你提供更快的答案。
答案 1 :(得分:0)
如果k是素数,则它在集合中没有因子而且你已经完成了。否则,k = p * q其中p是k的最小因子。做q的二进制搜索。如果找到了,你就完成了。否则,重构k = p'* q',其中p'是p之后k的下一个最大因子 - 如果没有,你就完成了。否则,继续二进制搜索q' - 注意q'< q,因此您可以使用q的高限继续搜索。继续,直到找到一个因子或者你已经搜索了k的最大因子。这是O(logn)。在k = 8的具体情况下,你首先搜索4,然后搜索2 ...如果两者都没有找到,那么该集合不包含k的除数。
编辑: 嗯......我猜这不是O(logn)。例如,如果列表对于k的每个因子f包含f-1,那么你将不得不连续搜索每个f,每次点击f-1 ......那将是O(n)。
答案 2 :(得分:0)
计算k的gcd和集合成员的乘积。例如,gcd(3 * 4 * 5,8)= 4。