有人可以为这个问题建议算法吗?
有一个充满糖果的房间(n其中0 我们可以根据需要多次询问网守。请提出一种小于o(n)的方法。If the candies are 110
e.g.
1. Are the candies greater than 50?
Answer: Yes
2. Are the candies greater than 112?
Answer: No
答案 0 :(得分:2)
首先,您必须找到上限。为此,您可以尝试连续2的幂(或10,或任何其他基数,但为简单起见,假设2),直到找到一个大于蜡烛数量的数字。
现在有了上限,可以使用基本的binary search直到找到正确的数字。
对于您的示例110,看起来可能像这样:
不难发现,两个阶段都将执行 log 2 n 个步骤,总复杂度为O(logn)。
答案 1 :(得分:1)
答案是指数搜索和二进制搜索的简单组合。首先,通过将Hi
乘以2
来找到糖果数的上限,直到大于糖果数。请注意,当我们停止Hi
时,最多是2xcandies
。因此,在执行二进制搜索后,时间复杂度为O(log(2n))
,与O(log n)
相同。这是伪代码:
Hi = 1
while (are there more than Hi candies?==Yes)
Hi = 2*Hi
Lo = 1,
M = floor((Lo + Hi)/2)
while (Lo < Hi)
if (are there more than M candies? == Yes)
Lo = M+1
M = floor((Hi+Lo)/2)
else
Hi = M
M = floor((Hi+Lo)/2)
return M
答案最后存储在M
中。 (实际上,到最后我们有了Hi=Lo=M
。因此它们中的任何一个都可以报告为糖果的数量)。
在Wiki上查找exponential search页。