在游戏中,您的目标是猜测 1 到 n 范围内的数字。每轮最多允许进行 ⌈log n⌉ 次猜测。在 m 轮的过程中(其中 m < n), you record the correct answers in an array M[i], with i starting from 1 to m. Initially, designing an algorithm that runs in O(m*log(n)) time is straightforward. However, a new condition has been introduced: M[i] ≤ M[j] for all i > j,这意味着答案按降序排列。任务是找到一种在给定修改条件的情况下在 O(n) 时间内运行的算法。
基于条件 M[i] ≤ M[j](对于所有 i > j),我可以将范围缩小到 1 到 n 之间。但在最坏的情况下,我仍然无法得到O(n)。 另外,你不能粗暴地强制猜测数字,这是有限制的。
一些澄清: 1.当你猜测时,系统会告诉你太大或太小。 (这是一个经典的二分搜索问题) 2.答案按降序排列。 3.每轮猜测次数的限制是⌈log n⌉,而不是log(n) + 1,抱歉我之前表述中的错误。
我举个例子,希望对你有帮助。
如果您需要更多信息,请告诉我。
提前致谢!
输入:
目标:通过对每个索引进行最多 ⌈log n⌉ 次猜测来按顺序重新创建 M,运行时间为 O(n)。 IE。我们不能直接访问 M,而只能猜测第一个未确定索引的值,并了解我们的猜测是否正确、太大或太小。
注释:
给定 M[i-1] 确定 M[i] 的过程:
第一个约束分析: 最多猜测 k = ⌈log n⌉ 步中的每个数字。
案例1步骤:1
情况 2 步骤:M[i] - M[i-1] + 1 <= k
情况 3:二分查找最多需要 ⌈log n⌉ - 1 步,范围为 1 到 n - ⌈log n⌉。鉴于此,这最多需要 k 步(初始猜测,加上二分搜索最多 k-1 步)。
因此这满足了第一个约束,即每个数字最多可以通过 k 步来猜测。
第二个约束分析:算法应该是O(n)。
假设 G[i] 是我们为确定 M[i] 所做的猜测次数。请注意,对于所有三种情况,G[i] <= M[i-1] - M[i] + 1. In other words, if successive values of M differ by r, we will determine the latter value in at most r+1 guesses (never more than k, but we don't need that fact for this portion).
但是所有 M 的累积差异最多为 n-1,并且 |M| < n, so the total number of guesses must be <= (n-1) + |M| < (n-1) + n = 2n-1 = O(n).