标签:二分法

  • 递归解法(不建议)
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        if len(nums) == 1:
            return 0
        elif len(nums) == 2:
            if nums[1] > nums[0]:
                return 1
            else:
                return 0
        
        for i in range(1, len(nums) - 2):
            if nums[i] > nums[i - 1] and nums[i] > nums[i + 1]:
                print(i)
                return i
        
        if nums[0] > nums[len(nums) - 1]:
            return 0
        else:
            return len(nums) - 1
  • 二分法(建议)

参照: https://blog.nowcoder.net/n/eafbb55131ec4e7f83360ed84c7ad911

核心逻辑:

//右边是往下,不一定有坡峰
if(nums[mid] > nums[mid + 1])
    right = mid;
//右边是往上,一定能找到波峰
else
    left = mid + 1;

完整代码:

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