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