📅  最后修改于: 2023-12-03 15:10:05.608000             🧑  作者: Mango
在一个整数数组中,如果一个元素比它两侧的元素都大(或都小),那么这个元素就被称为峰值元素。
下面介绍两种解决这个问题的解法。
首先我们可以采用最简单的方法:遍历整个数组, 一旦找到一个峰值元素,就返回它的下标。
def find_peak_element(nums):
n = len(nums)
for i in range(n):
if i == 0 and nums[i] > nums[i+1]:
return i
elif i == n-1 and nums[i] > nums[i-1]:
return i
elif nums[i] > nums[i-1] and nums[i] > nums[i+1]:
return i
这段代码的时间复杂度是$O(n)$。
我们可以应用二分查找的思想,来找到一个峰值元素。
首先我们可以观察到一个性质:如果 nums[i] > nums[i+1],那么在nums[0:i]之间一定存在峰值元素(包括第一个元素),因为这个区间是单调递减的。
同理,如果 nums[i] > nums[i-1],那么在nums[i:n-1]之间一定存在峰值元素(包括最后一个元素),因为这个区间是单调递增的。
这样,我们就可以采用二分查找的思想来解决这个问题,每次将查找区间缩小一半。
def find_peak_element(nums):
n = len(nums)
left, right = 0, n-1
while left < right:
mid = (left + right) // 2
if nums[mid] < nums[mid+1]:
left = mid + 1
else:
right = mid
return left
这段代码的时间复杂度是$O(logn)$。
注意,以上两种方法只能返回一个峰值元素,如果存在多个峰值元素,则可能返回任意一个。
采用二分查找的方法时间效率更高,但代码实现稍微复杂一些。在实际应用中需要根据具体问题选择合理的方法。