【问题标题】:Card Flipper Analysis卡片翻转分析
【发布时间】:2013-04-23 12:19:00
【问题描述】:

我即将参加我的数据结构课程的考试。为了做好准备,我正在研究一些我在网上找到的基于算法的问题,但遇到了一个我似乎无法解决的问题。

你走进一个房间,看到一排 n 张卡片。每一个都有一个数字xi 写在上面,其中 i 的范围从 1 到 n。但是,最初所有的卡 面朝下。你的目标是找到一个局部最小值:也就是说,一张我的卡片 number 小于或等于它的邻居,xi-1 >= xi

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

基本上,如果您看到卡片“7”,那么如果左边的卡片是“10”而右边的卡片是“9”,那么它就是局部最小值。这如何在登录时间内轻松完成?

任何帮助表示赞赏,谢谢。

【问题讨论】:

  • 如果是在日志时间里,那建议你选择二分查找类型的解决方案,当你一直选择中心卡,然后根据值将剩余的卡向左或向右分割。
  • 和这个问题本质上是一样的问题:stackoverflow.com/questions/12238241/…
  • @NarutSereewattanawoot 正是我想要的,谢谢。

标签: algorithm


【解决方案1】:

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

  1. 查看第一个和最后一个元素。如果有任何一个是分钟,则返回。
  2. 查看中间元素。如果是一分钟就退货。否则它的左邻居或右邻居必须小于它。递归那一半。

所以这个想法是,如果我们知道中心元素的左邻居比它小,那么左半部分必须在某个地方有一个局部最小值,这样我们就可以安全地在那里递归。右半部分也是如此。

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

同样,运行时间显然是 log(n),因为每一步都需要恒定的时间,而且我们必须执行 log(n) 步骤,因为我们每次都将数据减半。

【讨论】:

    猜你喜欢
    • 2017-04-03
    • 2014-02-25
    • 2013-11-22
    • 2015-06-05
    • 2022-01-03
    • 2012-04-04
    • 2014-03-03
    • 1970-01-01
    相关资源
    最近更新 更多