难度:中等
题目描述:
给定一个长度为 n 的整数 山脉 数组 arr ,其中的值递增到一个 峰值元素 然后递减。
返回峰值元素的下标。
你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。
示例 1:
输入:arr = [0,1,0]
输出:1
示例 2:
输入:arr = [0,2,1,0]
输出:1
示例 3:
输入:arr = [0,10,5,2]
输出:1
解题思路:
JavaScript实现:
第一种写法:
/**
* @param {number[]} arr
* @return {number}
*/
var peakIndexInMountainArray = function (arr) {
let left = 1
let right = arr.length - 2
while (left <= right) {
let mid = left + ((right - left) >> 1)
if (arr[mid] > arr[mid + 1] && arr[mid] > arr[mid - 1]) {
return mid
} else if (arr[mid] > arr[mid + 1] && arr[mid] < arr[mid - 1]) {
right = mid - 1
} else if (arr[mid] < arr[mid + 1]) {
left = mid + 1
}
}
};
第二种写法:
var peakIndexInMountainArray = function (arr) {
let left = 0
let right = arr.length - 1
while (left < right) {
let mid = Math.floor((right + left) / 2 )
if (arr[mid] < arr[mid + 1]) {
left = mid + 1
} else {
right = mid
}
}
return left
};
tips:可以依据题目条件,利用二分查找适当缩小查找范围