📌  相关文章
📜  找到一个峰值元素(1)

📅  最后修改于: 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)$。

注意,以上两种方法只能返回一个峰值元素,如果存在多个峰值元素,则可能返回任意一个。

总结

采用二分查找的方法时间效率更高,但代码实现稍微复杂一些。在实际应用中需要根据具体问题选择合理的方法。