162. Find Peak Element

2017-12-02  本文已影响0人  larrymusk

/*
第一个数和最后一个数都小于其相邻数,所以数组一定存在峰值。考虑使用二分
法,取中间值后有以下几种情况:
中间值比其右边数小,说明其处在上升沿中,峰值在其右侧, start = mid

中间值比其左边数小,说明其处在下降沿中,峰值在其左侧, end = mid

(中间值比两边都小,那么左侧和右侧都有峰值,舍弃哪边都可以。)
中间值比两边的数都大,是峰值,直接返回即可。

*/

int findPeakElement(int* nums, int numsSize) {
    int start = 0;
    int end = numsSize-1;
    int mid;
    while(start+1 < end){
        mid = start+(end - start)/2;
        
        if(nums[mid] < nums[mid+1])
            start = mid;
        else if(nums[mid] < nums[mid-1])
            end = mid;
        else
            end = mid;
    }
    
    if(nums[start] > nums[end])
        return start;
    else
        return end;
}
上一篇 下一篇

猜你喜欢

热点阅读