
虽然这题不是递增数组,但是这个数组依然能按照二分的思想分成两份。选一个Mid,根据mid 和 mid+1的数值判断mid是在峰顶左侧(上坡)还是峰顶右侧(下坡),如果mid在峰顶左侧,那么mid左边的值都在峰顶右侧(因为我们只需要找任意一个峰顶就行)。e.g. 1, 2, 1, 4有两个峰顶,按照这个算法,得出的结果应该是2这个峰顶。判断完mid左侧为红色之后,继续判断右侧的未知颜色。如果mid在峰顶右侧或者mid就是峰顶,那么判断左侧未知属性。
python
class Solution:
def findPeakElement(self, nums: List[int]) -> int:
left = 0
n = len(nums)
right = n-2 # n-1 必定为蓝色, 并且防止越界
while left <= right:
mid = (left + right) // 2
v = nums[mid]
nxt = nums[mid + 1]
if v < nxt:
# 左侧:红色
left = mid + 1
else:
# 右侧: 蓝色
right = mid - 1
return left