[leetcode] 162. Find Peak Element

题目

A peak element is an element that is strictly greater than its neighbors.

Given an integer array nums, find a peak element, and return its index. If the array contains multiple peaks, return the index to any of the peaks.

You may imagine that nums[-1] = nums[n] = -∞.

You must write an algorithm that runs in O(log n) time.

Example 1:

Input: nums = [1,2,3,1]
Output: 2
Explanation: 3 is a peak element and your function should return the index number 2.

Example 2:

Input: nums = [1,2,1,3,5,6,4]
Output: 5
Explanation: Your function can return either index number 1 where the peak element is 2, or index number 5 where the peak element is 6.

Constraints:

  • 1 <= nums.length <= 1000
  • -231 <= nums[i] <= 231 - 1
  • nums[i] != nums[i + 1] for all valid i.

思路

二分查找,每次二分判断中间值是否是山峰,如果是则直接返回。否则继续判断是否是上坡,如果是则山峰位于右侧,需删除左侧;否则删除右侧。

代码

python版本:

class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        l, r = 0, len(nums)
        while l < r:
            mid = (l+r)//2
            if mid == 0:
                return 0
            if mid+1 < len(nums) and nums[mid+1] < nums[mid] > nums[mid-1]:
                return mid
            if nums[mid] > nums[mid-1]:
                l = mid+1
            else:
                r = mid
        return l-1	

posted @ 2022-03-13 23:47  frankming  阅读(16)  评论(0编辑  收藏  举报