返回

拨开迷雾,携手寻找 LeetCode 852 题的峰顶索引!

后端

峰顶索引的定义

山脉数组是一种特殊的数组,它具有以下属性:

  • arr.length >= 3
  • 存在 i (0 < i < arr.length - 1) 使得:arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1]

峰顶索引是数组中最大的元素索引,即 arr[i] 是数组中的最大值。

二分法算法简介

二分法算法是一种在有序数组中快速查找特定元素的有效算法。其基本思想是将数组分成两半,然后根据目标元素与中间元素的大小关系来确定目标元素位于哪一半。重复这一过程,直到找到目标元素或数组为空。

二分法查找峰顶索引

我们可以使用二分法算法来高效地找到峰顶索引。以下是详细步骤:

  1. 初始化左边界 left 为 0,右边界 right 为数组长度减一 len - 1。
  2. 计算数组的中间索引 mid。
  3. 比较 arr[mid] 与 arr[mid + 1] 的大小关系:
    • 若 arr[mid] < arr[mid + 1],说明峰顶索引在右半部分,因此将 left 更新为 mid + 1。
    • 若 arr[mid] > arr[mid + 1],说明峰顶索引在左半部分,因此将 right 更新为 mid。
    • 若 arr[mid] == arr[mid + 1],说明当前索引可能是峰顶索引或位于山脉的平坦区域,继续二分查找。
  4. 重复步骤 2 和 3,直到 left > right。
  5. 最终 left 和 right 相等,此时 left 和 right 指向的索引即为峰顶索引。

代码示例

以下是用 Java、Python 和 C++ 实现的二分法查找峰顶索引的代码示例:

Java 代码:

class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int left = 0, right = arr.length - 1;
        while (left < right) {
            int mid = (left + right) / 2;
            if (arr[mid] < arr[mid + 1]) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }
}

Python 代码:

def peakIndexInMountainArray(arr):
    left, right = 0, len(arr) - 1
    while left < right:
        mid = (left + right) // 2
        if arr[mid] < arr[mid + 1]:
            left = mid + 1
        else:
            right = mid
    return left

C++ 代码:

int peakIndexInMountainArray(vector<int>& arr) {
    int left = 0, right = arr.size() - 1;
    while (left < right) {
        int mid = (left + right) / 2;
        if (arr[mid] < arr[mid + 1]) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    return left;
}

总结

在本文中,我们讨论了山脉数组的峰顶索引的定义,并介绍了如何使用二分法算法高效地找到峰顶索引。通过提供清晰的代码示例和详细的解释,我们希望能帮助您理解并掌握这一算法。如果您在 LeetCode 852 题中遇到了困难,希望本文能够为您提供必要的帮助。