162. 寻找峰值

https://leetcode-cn.com/problems/find-peak-element/

解法一:二分(递归分治)

class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        n = len(nums)
        #边界
        if n == 1:
            return 0
        elif n == 2:  #长度为2时取较大的
            return 0 if nums[0] > nums[1] else 1
        #长度>=3
        else:
            mid = n // 2  #取中点
            #若中点比两侧大,直接去中点
            if nums[mid-1] < nums[mid] > nums[mid+1]:
                return mid
            #若左侧大,说明左侧可能存在山峰,递归处理左侧数组
            elif nums[mid-1] > nums[mid]:
                return self.findPeakElement(nums[:mid])
            #否则递归处理右侧
            else:
                return mid+1 + self.findPeakElement(nums[mid+1:])

解法二:还是二分

其实也不用递归,不仅慢,占用内存还多,直接传统二分

解法三:暴力

首尾添加负无穷元素,然后一次遍历,结果和二分一样快,奇了怪

最后更新于