返回

揭秘 LeetCode 162:找出山峰元素,巧用二分法!

后端

前言:

探索计算机科学广阔世界时,算法和数据结构是不可或缺的工具。算法是解决特定问题的步骤,而数据结构是组织和存储数据的有效方式。LeetCode 是一个备受欢迎的在线平台,提供了大量算法和数据结构题目,旨在挑战和提升程序员的技能。

挑战:寻找峰值元素

LeetCode 162 题:“寻找峰值元素”提出了一个引人入胜的挑战。峰值元素是指其值大于左右相邻值的元素。给定一个数组 nums,任务是找到峰值元素并返回其索引。

二分法:优雅的解决方案

二分法是一种广泛使用的算法,它通过不断将搜索范围缩小一半来高效地查找有序数组中的元素。对于寻找峰值元素,二分法提供了简洁优雅的解决方案。

二分法算法的步骤如下:

  1. 初始化搜索范围: 将左右边界设置为 [left, right]。
  2. 计算中点: 计算数组中点 mid = (left + right) / 2。
  3. 比较中点: 将 mid 与其相邻元素 nums[mid-1] 和 nums[mid+1] 进行比较:
    • 如果 nums[mid] 大于相邻元素,则 mid 是峰值元素。返回 mid。
    • 如果 nums[mid] 小于 nums[mid+1],则峰值元素在右侧子数组中。更新 left = mid + 1。
    • 如果 nums[mid] 小于 nums[mid-1],则峰值元素在左侧子数组中。更新 right = mid - 1。
  4. 循环: 重复步骤 2-3,直到 left > right。

实现:

def find_peak_element(nums):
    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

示例:

给定数组 nums = [1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1],find_peak_element 函数将返回索引 6,对应的峰值元素为 7。

结论:

LeetCode 162 题“寻找峰值元素”是一个经典的算法问题,它可以通过二分法高效解决。通过练习解决这样的问题,程序员可以磨练他们的算法和数据结构技能,并为更复杂的计算机科学挑战做好准备。