卡片翻转分析

时间:2013-04-29 18:05:07

标签: algorithm

我很快就会在我的数据结构课上参加考试。准备我正在查看我在网上找到的一些基于算法的问题并遇到一个我似乎无法获得的问题。

你走进一个房间,看到一排n张牌。每个人都有一个数字xi 写在上面,我的范围从1到n。但是,最初所有的卡 面朝下你的目标是找到一个当地的最低限度:即,我的卡 number小于或等于其邻居的数量,xi-1> = xi <= xi + 1。 第一张和最后一张牌也可以是本地最小牌,他们只有一张 邻居比较。显然,可能会有很多本地最小值,但是你 只负责找到其中一个。

我能想出的唯一解决方案就是将它们全部转过来并找到任何局部最小值。然而,挑战是仅通过转换O(logn)卡来实现这一点。

基本上如果你看到一张牌“7”,如果左边的牌是“10”并且右边的牌是“9”,那么这是局部最小值。在登录时间如何轻松完成?

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:3)

二进制搜索是要走的路。以下是如何做到这一点的草图:

  1. 查看第一个和最后一个元素。如果其中一个是分钟,则将其退回。
  2. 看看中间的元素。如果它是一分钟返回它。否则,其左邻居或右邻居必须小于它。递减一半。
  3. 所以我的想法是,如果我们知道中心元素的左邻居小于它,那么左半部分必须在某个地方有一个局部最小值,所以我们可以安全地在那里递归。右半部分也是如此。

    换句话说,一半数据不具有局部最小值的唯一方法是它是单调还是上升和下降,这两种情况都不会发生,因为我们知道端点值。

    此外,运行时显然是log(n),因为每个步骤都需要时间,我们必须执行log(n)步骤,因为我们每次都将数据减半。