162. 寻找峰值

  1. [题目链接](162. 寻找峰值 - 力扣(LeetCode))

  2. 解题思路:题目有一个很重要的前提是:对于所有有效的 i 都有 nums[i] != nums[i + 1]。先看开头和结尾,如果nums[0] > nums[1]或者nums[n - 1] > nums[n - 2],那么可以直接返回了。否则从左就是【往上爬的趋势】,从右也是【往上爬的趋势】,又因为每个数都不相同且一定有峰顶,那么峰顶可以在中间

    • 直接[i,j]二分,得到mid
      • 如果mid大于左右的结果,那么直接返回了
      • 如果nums[mid] < nums[mid - 1],从i往右开始,是往上爬的趋势,从mid开始往左,也是往上爬的趋势,所以左边肯定有一个峰顶,即j = mid - 1
      • 否则,i = mid + 1
  3. 代码

    class Solution:
        def findPeakElement(self, nums: List[int]) -> int:
            if len(nums) == 1:
                return 0
            if nums[0] > nums[1]:  # 如果第0位置大于第一位置,0位置就是峰值
                return 0
            if nums[-1] > nums[-2]:   # 如果最后一个位置大于倒数第二个位置,最后一个位置就是峰值
                return len(nums) - 1
    
            i = 0
            j = len(nums) - 1
            while i <= j:
                mid = math.trunc((i + j) / 2)
                if mid - 1 >= 0 and nums[mid] > nums[mid - 1] and mid + 1 < len(nums) and nums[mid] > nums[mid + 1]:
                    return mid
                if mid - 1 >= 0 and nums[mid] < nums[mid - 1]:
                    j = mid - 1
                else:
                    i = mid + 1
            return -1
    
posted @ 2025-01-09 10:04  ouyangxx  阅读(9)  评论(0)    收藏  举报