面试150 寻找峰值
思路
暴力法,直接返回最大元素所在下标,因为找到了最大元素,两边的元素肯定小于等于它。
class Solution:def findPeakElement(self, nums: List[int]) -> int:return nums.index(max(nums))
二分法:在每次查找中,通过比较中间位置 mid 的元素与其右侧元素 nums[mid + 1] 的大小关系,判断峰值所在的方向。如果 nums[mid] > nums[mid + 1],说明峰值可能就在 mid 或其左侧,因此将搜索区间缩小为左半部分;反之,则说明峰值必定在右侧,缩小搜索范围为右半部分。不断缩小区间,最终会收敛到某个峰值元素的索引
class Solution:def findPeakElement(self, nums: List[int]) -> int:left, right = 0, len(nums) - 1while left < right:mid = (left + right) // 2if nums[mid] > nums[mid + 1]:right = midelse:left = mid + 1return left