1. 题目
2. 分析
这道题的难点有二:第一,知道用二分法求解;第二,二分判断的标准是什么?传统的题目的二分标注都是跟某个固定的值做比较,但是此题不然。此题的比较对象是相邻的元素。
不要硬凭自己的脑子想,要结合题意,将分析落到纸上。
3. 代码
根据上面的分析,那么可以得到下面这个代码:
class Solution:def findPeakElement(self, nums: List[int]) -> int:left = 0right = len(nums)-1if len(nums) == 1:return 0 if len(nums) == 2:if nums[0] > nums[1] :return 0else:return 1 while(left <= right):mid = (left + right) // 2if mid == 0:if nums[mid] > nums[mid+1]:return 0if mid == len(nums) - 1:if nums[mid] > nums[mid-1]:return midif nums[mid-1] < nums[mid] < nums[mid+1]:left = mid+1elif nums[mid-1] > nums[mid] > nums[mid+1]:right = mid-1elif nums[mid-1] < nums[mid] and nums[mid] > nums[mid+1]:return midelse: # 先减后增left = mid+1
上面这个代码一堆if-else,显然不够优雅。可以看到其主要拙劣的地方在于对mid 值的判断。借鉴一下官方题解中的代码:
写的确实比我的代码好。