二分查找-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:
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;}
};