寻找峰值——二分

峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞

你必须实现时间复杂度为 O(log n)的算法来解决此问题。

示例 1:

复制代码
输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2。
  • 对于所有有效的 i 都有 nums[i] != nums[i + 1]

思路:

二分。从mid点开始爬坡,只要是向上走(numsmid<pre 、 numsmid<after),在这个向上的部分,一定会出现峰值(即便一直递增爬坡,边界也会是峰值)

python 复制代码
from typing import List


class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        left,right=0,len(nums)-1
        while left<=right:
            mid=left+(right-left)//2
            pre=nums[mid-1] if mid>0 else -float('inf')
            after=nums[mid+1] if mid<len(nums)-1 else -float('inf')
            if nums[mid]>pre and nums[mid]>after:
                return mid
            elif nums[mid]<after:
                left=mid+1
            else:
                right=mid-1
        return -1
相关推荐
circuitsosk31 分钟前
NL2SQL在工业级场景下的精度优化:Schema Linking + 动态Few-shot实战
人工智能·python·sql·大模型·nl2sql
warpdrivelabs2 小时前
Codex 开源 harness 全面了解
开发语言·人工智能
2401_894915532 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
1000世界小札3 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121976 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
Java牛马6 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
丰锋ff6 小时前
基于 Qt 的智能门禁系统(二)
开发语言·qt
吴声子夜歌6 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
fpcc6 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
kobe_OKOK_6 小时前
DRF接口幂等操作
python·django