题目大意
https://leetcode-cn.com/problems/find-peak-element/description/
峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞。
解题思路
二分查找变种
代码
方法1:顺序遍历。
本题的一个重要特点是,从第一个元素开始,若其大于相邻的后续元素,则第一个元素就是一个局部最大值,返回即可。若其小于相邻的后续元素,则第二个元素大于第一个元素。如此,一一遍历数组,第一次出现,第i个元素若大于其相邻后续元素,则该元素就是一个局部最大值
方法2:二分查找
思路:如果中间元素大于其相邻后续元素,则中间元素左侧(包含该中间元素)必包含一个局部最大值。如果中间元素小于其相邻后续元素,则中间元素右侧必包含一个局部最大值。
class Solution(object):
def findPeakElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
left = 0
right = len(nums)-1
while left <= right:
print left, right
if left == right:
return left
mid = left + (right -left) / 2
# 如果中间小于右边,那么一定在右边
if nums[mid] < nums[mid+1]:
left = mid + 1
# 左边不小于右边,那么直接把右边弄到中间
else:
# right不可以是mid-1,万一正好是mid,就跳过了,因为并没有比对mid的值
right = mid