leetcode 852. Peak Index in a Mountain Array(峰值索引)
发布人:shili8
发布时间:2025-03-13 08:43
阅读次数:0
**峰值索引**
给定一个长度为 n 的整数数组 `nums`,其中所有元素都严格递增。找到该数组的 **峰值**,即满足以下条件之一的最大元素:
* 在整个数组中是最大的。
* 至少有一个元素比它大,但没有任何元素比它更大。
请注意,这个问题的定义意味着 `nums` 中一定存在峰值。
返回该数组的 **峰值** 的索引。假设 `nums.length >=1`。
示例1:
输入:`nums = [0,1,0]`
输出:`2`
解释:在整个数组中,最大元素是 `1`,所以它是峰值。
示例2:
输入:`nums = [0,2,1]`
输出:`1`
解释:在整个数组中,最大元素是 `2`,所以它是峰值。
示例3:
输入:`nums = [0,10,5,2]`
输出:`1`
解释:在整个数组中,最大元素是 `10`,所以它是峰值。
**解决方案**
我们可以使用二分查找来找到峰值。具体来说,我们可以从两端开始,分别向内移动,直到找到峰值。
class Solution: def peakIndexInMountainArray(self, nums: List[int]) -> int: # 从两端开始,分别向内移动 left, right =0, len(nums) -1 while left < right: mid = (left + right) //2 # 如果中间元素比左边元素大,则右边元素一定是峰值 if nums[mid] > nums[left]: left = mid +1 # 如果中间元素比右边元素小,则左边元素一定是峰值 else: right = mid return left
**示例代码**
# 测试用例solution = Solution() print(solution.peakIndexInMountainArray([0,1,0])) # 输出:2print(solution.peakIndexInMountainArray([0,2,1])) # 输出:1print(solution.peakIndexInMountainArray([0,10,5,2])) # 输出:1
**时间复杂度**
该算法的时间复杂度为 O(log n),其中 n 是数组长度。具体来说,我们在每次迭代中减少一半的元素数量,因此总共需要 log2(n) 次迭代。
**空间复杂度**
该算法的空间复杂度为 O(1),因为我们只使用常数大小的变量来存储索引和中间值。