算法:修改二进制搜索

Ali*_*Ali 4 c++ algorithm binary-search

我正试图解决一个经典的面试问题,这个问题基本上是在列表上进行二元搜索,然后逐渐增加然后减少.即使很明显我们可以实现O(log n),但我无法弄清楚我写的下面的代码有什么问题:

#include <iostream>

using namespace std;


int binarySearch(int *A, int low, int high, int key)
{
    while(low < high)
    {
        int mid = (low + high) / 2;
        if(key < A[mid])
        {
            if(A[mid - 1] < A[mid] && A[mid] < A[mid + 1])
                high = mid - 1;
            else
                low = mid + 1;
        }
        else if(key > A[mid])
        {
            if(A[mid - 1] < A[mid] && A[mid] < A[mid + 1])
                low = mid + 1;
            else
                high = mid - 1;
        }
        else
            return mid;
    }

    return -(low + 1);
}


int main()
{
    const int SIZE = 8;
    int A[SIZE] = {3,5,7,14,9,8,2,1};
    cout<<binarySearch(A, 0, SIZE, 14);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我问这个问题的原因是因为我想知道两件事.1)代码有什么问题,因为它失败了某些值,如"14".2)可以改进吗?

kee*_*lar 6

我认为你的代码不能很好地处理数组的增加和减少部分.

而不是告诉你究竟如何做到这一点,这里有一些提示,我希望你能够完成它:)

一种解决方案是首先找到数组从O(logn)中的递增顺序到递减顺序的点,然后基于此,在O(logn)中执行特殊版本的二进制搜索.

让我知道,如果您不知道如何做到这一点,我会更多地解释我的答案.