【问题标题】:Enhanced Binary Search增强的二分搜索
【发布时间】:2016-11-15 13:03:13
【问题描述】:

我正在做面试准备问题,遇到了这个问题:在排序和旋转的数组中搜索一个元素。

对我来说最明显的解决方案是 1) 找到枢轴点(数字大于下一个数字的位置),然后 2) 将其用作分界点知道旋转排序数组的哪一半执行二分查找。

我找到了一个“更好”(或者他们在极客中声称为极客)的解决方案。为了不让你对代码感到厌烦,这里是高级的想法。我的问题是:我不明白如何找到中间点让我们只通过一次搜索。老实说,这是否比我最初提出的解决方案更好?

高级“改进/更好”的方法:

1) Find middle point mid = (l + h)/2
2) If key is present at middle point, return mid.
3) Else If arr[l..mid] is sorted
    a) If key to be searched lies in range from arr[l]
       to arr[mid], recur for arr[l..mid].
    b) Else recur for arr[mid+1..r]
4) Else (arr[mid+1..r] must be sorted)
    a) If key to be searched lies in range from arr[mid+1]
       to arr[r], recur for arr[mid+1..r].
    b) Else recur for arr[l..mid] 

【问题讨论】:

  • 它可能有助于您定义“排序和旋转数组”的含义。根据我在网上找到的类似问题,我认为您的意思是一个已排序并已旋转的数组。例如。 [4、5、1、2、3]。是这个意思吗?
  • 如果我理解您的解决方案,它是 O(n),因为您必须扫描数组才能找到旋转点。如果您仍然要扫描数组,那么您也可以在执行此操作时查找元素。所以你的方法并不比只检查每一项更好。
  • 您描述的更好的方法可以在这里找到更详细的信息:articles.leetcode.com/searching-element-in-rotated-array。本质上,在每个步骤中,您都将输入减半,所以这个解决方案是 O(log n)。

标签: binary-search


【解决方案1】:

您的第 1 步要求您找到支点。为此,需要进行搜索。该解决方案将枢轴点的二分搜索与目标的二分搜索相结合;你的解决方案没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多