先递增后递减的数组中找最值

2018-04-02  本文已影响99人  analanxingde

问题分析

最小值

先增后减的数组,最小值一定是首尾元素中较小的那个

最大值

(1)如果数组先增大再减小,峰值就是最大值。
(2)如果数组单调递增,最后一个元素就是最大值。
(3)如果数组单调递减,第一个元素就是最大值。
(4)如果数组全部都一样,任何一个元素都是答案,更极端地,如果数组只有一个元素,那么这唯一的元素就是答案。

最大值代码

int FindMax(int *A, int m)
{
    if(m == 0) return -1;            //如果数组大小为0,则返回错误
    int begin = 0;
    int end = m - 1;
    int MP =  (begin + end)/2;
    
    while(MP > 0 && MP < m -1)
    {
        if(A[MP] > A[MP+1] && A[MP] > A[MP-1]){  //如果符合条件就返回此值
                   return MP;        
          }else if (A[MP] < A[MP+1]){            //在递增段
                begin = MP+ 1;
                MP= begin + (end - begin)/2;
          }else{                                 //在递减段
                end = MP- 1;
                MP= begin + (end - begin)/2;
          }
    }
    
    if(MP == 0) return 0; //如果数组是完全递减的,则第一个值就是最大值
    if(MP == m-1) return m-1; //如果数组是完全递增的,则最后一个值为最大值
    return -1;
}
上一篇下一篇

猜你喜欢

热点阅读