我正在做面试准备问题,并遇到了这个问题:搜索已排序和旋转的数组中的元素。
对我来说最明显的解决方案是 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]
答案 0 :(得分:0)
您的第1步要求您找到枢轴点。要做到这一点,需要搜索。该解决方案结合了对枢轴点的二进制搜索和对目标的二进制搜索;你的解决方案没有。