您可能会记得,当且仅当:A.length >= 3
存在一些i
和0 < i < A.length - 1
,例如:
A[0] < A[1] < ... A[i-1] < A[i]
A[i] > A[i+1] > ... > A[A.length - 1]
注释:
arr.get(index)
函数及其length = arr.length()
访问数组。(3,5,3,2,0)
。 我的拍摄:
我想使用二进制搜索(进行一些修改)来找到峰值。牢记上述给定的山峰排列条件,只有3种可能性(坡度增加点,峰点,坡度减少点)
代码:
int getPeak(MountainArray &arr, int left, int right)
{
int mid;
int mid_num;
int after_mid, before_mid;
mid = (left + right) / 2;
if (mid == 0)
{
return getPeak(arr, mid + 1, right);
} // to make sure i dont violate the range of array by calculating before_mid.mid_num = arr.get(mid);
after_mid = arr.get(mid + 1);
before_mid = arr.get(mid - 1);
if (before_mid < mid_num && mid_num < after_mid)
{
return getPeak(arr, mid + 1, right);
}
else if (mid_num > after_mid && mid_num > before_mid)
{
return mid;
}
else if (mid_num > after_mid && mid_num < before_mid)
{
return getPeak(arr, left, mid - 1);
}
}
答案 0 :(得分:0)
您没有初始化mid_num
,这会导致未定义的行为。添加:
mid_num = arr.get(mid); // missing
after_mid = ...
...
顺便说一句,当您找到 local 峰(第二个分支)时,您可能还需要另外检查一下它是否是一个全局峰。如所写,它将为该数组{5,2,4,2,5}
返回索引2,根据您的定义,它不是一座山。