0162. 寻找峰值
大约 2 分钟
 --- 
0162. 寻找峰值
- 标签:数组、二分查找
- 难度:中等
题目链接
题目大意
描述:给定一个整数数组 nums。
要求:找到峰值元素并返回其索引。必须实现时间复杂度为 的算法来解决此问题。
说明:
- 峰值元素:指其值严格大于左右相邻值的元素。
- 数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
- 可以假设 。
- 。
- 。
- 对于所有有效的 都有 。
示例:
- 示例 1:
输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2。- 示例 2:
输入:nums = [1,2,1,3,5,6,4]
输出:1 或 5 
解释:你的函数可以返回索引 1,其峰值元素为 2;或者返回索引 5, 其峰值元素为 6。解题思路
思路 1:二分查找
- 使用两个指针 left、right。left指向数组第一个元素,right指向数组最后一个元素。
- 取区间中间节点 mid,并比较nums[mid]和nums[mid + 1]的值大小。- 如果 nums[mid]小于nums[mid + 1],则右侧存在峰值,令left = mid + 1。
- 如果 nums[mid]大于等于nums[mid + 1],则左侧存在峰值,令right = mid。
 
- 如果 
- 最后,当 left == right时,跳出循环,返回left。
思路 1:代码
class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        left = 0
        right = len(nums) - 1
        while left < right:
            mid = left + (right - left) // 2
            if nums[mid] < nums[mid + 1]:
                left = mid + 1
            else:
                right = mid
        return left思路 1:复杂度分析
- 时间复杂度:。
- 空间复杂度:。