题目:
峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞。
说明:
你的解法应该是 O(logN) 时间复杂度的。
思路:
用二分即可
#!/usr/bin/env python3.6
# _*_coding:utf-8 _*_
# @Time : 2019/10/30 22:28
# @Author : Grey
class Solution:
def findPeakElement(self, nums: List[int]) -> int:
n = len(nums)
if n <= 1:
return 0
def findPeak(x, y):
m = (x + y) // 2
if m > 0 and m < n-1:
if nums[m] > nums[m-1] and nums[m] > nums[m+1]:
return m
elif m == 0 and nums[m] > nums[m+1]:
return 0
elif m == n-1 and nums[m] > nums[m-1]:
return n-1
ans = n
if y-x >= 1:
ans = findPeak(m+1, y)
if ans != n:
return ans
if y-x > 1:
ans = findPeak(x, m)
return ans
return findPeak(0, n-1)
与题解不同的是,我每次直接判断m是否峰值,而由于只需要返回其中一个峰值的位置,题解直接判断nums[m]是否大于nums[m+1],若是则在左区间找,反之则在右区间找,因为峰值必会有左递增右递减,而边界都假设为负无穷,这样更简单一些。