查找山峰阵列的峰指数的代码

时间:2019-06-24 06:50:55

标签: c++ arrays

您可能会记得,当且仅当:A.length >= 3

存在一些i0 < 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)
  • 错误:控件到达非void函数的结尾。

我的拍摄
我想使用二进制搜索(进行一些修改)来找到峰值。牢记上述给定的山峰排列条件,只有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);
  }
}

1 个答案:

答案 0 :(得分:0)

您没有初始化mid_num,这会导致未定义的行为。添加:

mid_num = arr.get(mid);  // missing
after_mid = ...
...

顺便说一句,当您找到 local 峰(第二个分支)时,您可能还需要另外检查一下它是否是一个全局峰。如所写,它将为该数组{5,2,4,2,5}返回索引2,根据您的定义,它不是一座山。