【发布时间】: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