对于阵列的:一个1,一个2,...一个ķ,...一个Ñ,一个ķ是峰值当且仅当一个K-1 ≤一个ķ ≥一个K + 1时1 <K和K <N.一个1是,如果一个峰1 ≥一个2和Ñ是,如果一个峰N-1 ≤一个Ñ.目标是从阵列中找到一个峰值.
分而治之的算法如下:
find_peak(a,low,high):
mid = (low+high)/2
if a[mid-1] <= a[mid] >= a[mid+1] return mid // this is a peak;
if a[mid] < a[mid-1]
return find_peak(a,low,mid-1) // a peak must exist in A[low..mid-1]
if a[mid] < a[mid+1]
return find_peak(a,mid+1,high) // a peak must exist in A[mid+1..high]
Run Code Online (Sandbox Code Playgroud)
为什么这个算法是正确的?我认为它可能会失去一半存在峰值的阵列.
我正试图解决一个经典的面试问题,这个问题基本上是在列表上进行二元搜索,然后逐渐增加然后减少.即使很明显我们可以实现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 …Run Code Online (Sandbox Code Playgroud)