问题分析
最小值
先增后减的数组,最小值一定是首尾元素中较小的那个
最大值
(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;
}
网友评论