题目
难度:★★☆☆☆
类型:数组
我们把符合下列属性的数组 A 称作山脉:
A.length >= 3
存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]
给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1] 的 i 的值。
提示
3 <= A.length <= 10000
0 <= A[i] <= 10^6
A 是如上定义的山脉
示例
示例 1
输入:[0,1,0]
输出:1
示例 2
输入:[0,2,1,0]
输出:1
题目
我们使用二分法解决这个问题。
初始化考察的线段的左右端点:left=0,right=len(A)-1;
中点坐标:mid = left+(right-left)//2,中点左右相邻位置的坐标midl=mid-1,midr=mid+1;
通过中间处的连续三个元素查看趋势,山坡和山顶的区别:
山顶:中间位置元素比相邻左右元素都大,A[mid] > A[midl],A[mid]>A[midr];
山坡:中间及其相邻左右元素单调递增或递减,A[midl]<A[mid]<A[midr](左山坡)或者A[midl]>A[mid]>A[midr](右山坡)
对于左山坡,山顶在右半部分,我们去掉左半部分,考察右半部分;
对于右山坡,山顶在左半部分,我们去掉右半部分,考察左半部分。
class Solution:
def peakIndexInMountainArray(self, A):
"""
:param A: List[int]
:return: int
"""
left, right = 0, len(A)-1
while True:
mid = left + (right - left) // 2
midl, midr = mid-1, mid+1
if A[mid] > A[midl] and A[mid] > A[midr]:
return mid
elif A[midl] < A[mid] < A[midr]: # 左侧山坡
left = mid + 1
elif A[midl] > A[mid] > A[midr]: # 右侧山坡
right = mid - 1
如有疑问或建议,欢迎评论区留言~