📌  相关文章
📜  查找给定数组的峰值索引(1)

📅  最后修改于: 2023-12-03 15:10:46.430000             🧑  作者: Mango

查找给定数组的峰值索引

峰值定义: 数组中的峰值是指其左右的值都小于它的元素。

思路: 可以使用二分查找来找到峰值,因为峰值的左右两边一定不是单调递增或递减的。需要注意的是,当mid位置的值不是峰值时,判断它左边还是右边有可能存在峰值,因为峰值存在于任何非单调递增或递减序列中。

代码实现:

def find_peak_index(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    left, right = 0, len(nums) - 1
    
    while left < right:
        mid = (left + right) // 2
        
        if nums[mid] > nums[mid + 1]:
            right = mid
        else:
            left = mid + 1
        
    return left

代码说明:

  1. 定义左右指针,初始位置分别为数组的第一个和最后一个元素。
  2. 进入循环,每次取中间位置,判断该位置左右两边的值的大小关系。
  3. 如果mid位置的值大于mid+1位置的值,说明右边有可能存在峰值,因此将右指针指向mid位置。
  4. 如果mid位置的值小于或等于mid+1位置的值,说明左边有可能存在峰值,因此将左指针指向mid+1位置。
  5. 当左指针与右指针重合时,说明找到了峰值,返回左指针的值即可。

时间复杂度: O(logn)

参考链接: LeetCode 162. Find Peak Element