找到增加或减少1的数组的所有局部最大值

时间:2017-01-05 07:46:30

标签: algorithm

如何查找在O(k log n)次运行的算法,其中k是局部最大值的数量,n是数组的大小 例如:

[1,2,3,4,5,6,5,6,7,8,7]

1 个答案:

答案 0 :(得分:1)

作为一个粗略的想法,您可以使用最大值(显然以前已知)作为附加参数。如果数组是局部最大值,则检查数组的中间值(如果元素数是偶数,则检查中间值左侧或右侧的值)。如果它不是局部最大值,则搜索左或右子阵列中的局部最大值。 C#类伪代码的配方如下;如果需要最大值的位置,则必须另外进行一些指数计算。

List<int> Input;           // input array
List<int> Maxima;          // output for the maxima
int k;                     // num of local maxima

void SearchMaxima(List<int> iList, int NumOfMaxima)
{
   if (0 == iList.Count() || 0 == NumOfMaxima)
   {
     // do nothing
   }
   else
   {
      if (Middle point of iList is local Maximum)
      {
          Store middle point of iList to MaximaPositions
          SearchMaxima(left half of iList w/o middle point, NumOfMaxima - 1);
          SearchMaxima(right half of iList w/o middle point, NumOfMaxima - 1);
      }
      else
      {
          SearchMaxima(left half of iList w/o middle point, NumOfMaxima);
          SearchMaxima(right half of iList w/o middle point, NumOfMaxima);
      }
   }
}