📜  山数组 leetcode - Python (1)

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

山数组 leetcode - Python

介绍

山数组是指一个从左往右递增,从右往左递减的数组。给定一个山数组,要求找出数组中的最大值。本题要求使用O(log n)的时间复杂度来解决问题。

思路

从题目中可以看出,只需要找出数组中的最大值。由于数组是先递增后递减,所以最大值的位置一定在数组的中间。

可以用二分法来查找最大值。假设当前查找的区间为[l, r],在数组中间选出mid点。如果arr[mid - 1] < arr[mid] > arr[mid + 1],那么arr[mid]就是山数组的最大值。如果arr[mid - 1] < arr[mid] < arr[mid + 1],那么最大值就在mid的右边,可以将[l, r]的区间缩小到[mid+1, r]。如果arr[mid - 1] > arr[mid] > arr[mid + 1],那么最大值就在mid的左边,可以将[l, r]的区间缩小到[l, mid-1]。

代码
class Solution:
    def peakIndexInMountainArray(self, arr: List[int]) -> int:
        n = len(arr)
        l, r = 0, n - 1
        while l < r:
            mid = (l + r) // 2
            if arr[mid - 1] < arr[mid] > arr[mid + 1]:
                return mid
            elif arr[mid - 1] < arr[mid] < arr[mid + 1]:
                l = mid + 1
            else:
                r = mid - 1
总结

本题利用了山数组中最大值的位置特点,使用二分法查找,时间复杂度为O(log n)。在面对山数组类似的问题时,可以使用类似的思路来解决问题。