【python/leetcode/162/M】Find Peak Element

题目在这里插入图片描述

基本思路

注意⚠️:时间复杂度控制为log(n)

   /\
  /  \/\   /\
 /      \/   \
/             \

从上图可以看出,一条上升的边和一条下降的边之间至少夹着一个顶点元素。
由于左右两边各有一个无穷小的元素,所以起始的时候最左边的边是上升的,最右边的边是下降的。
要求时间复杂度为log(n),我们可以通过二分搜索来判断。
我们取中点和它后面的一个点,如果这两个点构成的边是上升的,那我们就把中点左边的点抛弃掉,这时候仍然满足最左边的边是上升的,最右边的边是下降的;如果两个点构成的边是下降的,那么该把中点右边的点抛弃掉,这样仍然满足上面的要求,保证左右两个点之间至少有一个顶点元素。至于如何在两点中选择新的左右节点,我们要尽可能使新的左右节点靠近顶点元素,因为最终的终止条件是左右节点重合。所以选择新的左节点时,应该选中点的后一个节点,而选新的右节点时,选择中点。

实现代码

class Solution(object):
    def findPeakElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        left,right = 0,len(nums)-1
        
        while left < right:
            mid = (left+right) // 2
            if nums[mid] < nums[mid+1]:
                left = mid + 1
            else:
                right = mid
        return left
            
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值