852. 山脉数组的峰顶索引
题目描述
给定一个长度为 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
提示:
3 <= arr.length <= 1050 <= arr[i] <= 106- 题目数据 保证
arr是一个山脉数组
解法
方法一
思考
数组保证先严格上升再严格下降,求峰下标。线性扫描可行,但 \(n\le 10^5\) 且题目暗示对数时间。峰左侧 \(arr[i]<arr[i+1]\),右侧相反。
在 \([1,n-2]\) 上二分:若 \(arr[mid]>arr[mid+1]\) 则峰在左半(含 \(mid\)),否则在右半。收缩后左端点即峰。
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |