📅  最后修改于: 2023-12-03 15:09:40.904000             🧑  作者: Mango
山数组是指一个从左往右递增,从右往左递减的数组。给定一个山数组,要求找出数组中的最大值。本题要求使用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)。在面对山数组类似的问题时,可以使用类似的思路来解决问题。