LeetCode 162 [Find Peak Element]

原题

你给出一个整数数组(size为n),其具有以下特点:
相邻位置的数字是不同的
A[0] < A[1] 并且 A[n - 2] > A[n - 1]
假定P是峰值的位置则满足A[P] > A[P-1]且A[P] > A[P+1],返回数组中任意一个峰值的位置。

给出数组[1, 2, 1, 3, 4, 5, 7, 6]返回1, 即数值 2 所在位置, 或者6, 即数值 7 所在位置.

解题思路

  • 分三种情况讨论
  • nums[mid] < nums[mid - 1]说明mid往前是一个递增区间,存在峰值
  • nums[mid] < nums[mid + 1]说明mid往后是一个递增区间,存在峰值
  • 第三种情况mid比左右都大,mid就是峰,返回mid

完整代码

class Solution(object):
    def findPeakElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return -1
            
        start, end = 0, len(nums) - 1
        while start + 1 < end:
            mid = start + (end - start) / 2
            if nums[mid] < nums[mid - 1]:
                end = mid
            elif nums[mid] < nums[mid + 1]:
                start = mid
            else:
                return mid
        return start if nums[start] > nums[end] else end

你可能感兴趣的:(LeetCode 162 [Find Peak Element])