-
[题目链接](162. 寻找峰值 - 力扣(LeetCode))
-
解题思路:题目有一个很重要的前提是:对于所有有效的
i
都有nums[i] != nums[i + 1]
。先看开头和结尾,如果nums[0] > nums[1]
或者nums[n - 1] > nums[n - 2]
,那么可以直接返回了。否则从左就是【往上爬的趋势】,从右也是【往上爬的趋势】,又因为每个数都不相同且一定有峰顶,那么峰顶可以在中间- 直接
[i,j]
二分,得到mid- 如果mid大于左右的结果,那么直接返回了
- 如果
nums[mid] < nums[mid - 1]
,从i
往右开始,是往上爬的趋势,从mid开始往左,也是往上爬的趋势,所以左边肯定有一个峰顶,即j = mid - 1
- 否则,
i = mid + 1
- 直接
-
代码
class Solution: def findPeakElement(self, nums: List[int]) -> int: if len(nums) == 1: return 0 if nums[0] > nums[1]: # 如果第0位置大于第一位置,0位置就是峰值 return 0 if nums[-1] > nums[-2]: # 如果最后一个位置大于倒数第二个位置,最后一个位置就是峰值 return len(nums) - 1 i = 0 j = len(nums) - 1 while i <= j: mid = math.trunc((i + j) / 2) if mid - 1 >= 0 and nums[mid] > nums[mid - 1] and mid + 1 < len(nums) and nums[mid] > nums[mid + 1]: return mid if mid - 1 >= 0 and nums[mid] < nums[mid - 1]: j = mid - 1 else: i = mid + 1 return -1