题解 | #寻找峰值#

寻找峰值

https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76

import re
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @return int整型
#
class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        l = 0
        r = len(nums)-1

        while l <r:
            mid  = l+(r-l)//2
            if nums[mid]<nums[mid+1]:
                l = mid+1
            else: # nums[mid] > nums[mid+1]
                r = mid
        return l

思路关键:通过分析知道,右侧一定有峰值

暴力的思路,直接扫一遍list,这样复杂度是O(n)

利用二分法简化:O(log(n))

注意题中给出的nums[-1]=nums[n]=-∞

假设有一个中间元素满足mid[i-1]<mid[i]<mid[i+1],要去左边还是右边呢?没法判断

换一个角度:右边在增长,右边一定有一个峰值,左边不用管了

如果右边开始下降,则左边一定有峰值了

实习算法题题解 文章被收录于专栏

实习算法题

全部评论

相关推荐

xtu大迫杰:偶遇校友,祝校友offer打牌
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务