二分查找-852.山峰数组的峰顶索引-力扣(LeetCode)

一、题目解析

1.山峰数组数据严格满足arr[0]<arr[1]......<arr[i]>arr[i+1]......arr[arr.size()-1]

2.时间复杂度要求为O(logN)

二、算法解析

解法1:暴力解法-O(N)

遍历数组arr,结合山峰数组性质,我们发现峰顶存在arr[i]>arr[i-1],即圆圈大于三角形,返回索引也就是arr数组的下标,由于遍历数组且最坏情况只有一个三角,也需要遍历n-1的元素,所以时间复杂度属于O(N)

解法2:二分查找-O(logN)

二段性

结合图像和题目的性质,我们可以把山峰数组分为两段,这是我们使用二分查找时,所需要总结或分析的性质

三、代码示例

解法2:

cpp 复制代码
class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr)
    {
        int left = 0,right = arr.size()-1;
        while(left<right)
        {
            int mid = left+(right-left+1)/2;
            if(arr[mid]>arr[mid-1]) left = mid;
            else right = mid - 1;
        }
        return left;
    }
};

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!