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 @   ouyangxx  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示