LeetCode162. 寻找峰值

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

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

你可以假设 nums-1 = numsn = -∞ 。

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

示例 1:

输入:nums = 1,2,3,1

输出:2

解释:3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入:nums = 1,2,1,3,5,6,4

输出:1 或 5

解释:你的函数可以返回索引 1,其峰值元素为 2;

或者返回索引 5, 其峰值元素为 6。

提示:

1 <= nums.length <= 1000

-2^31 <= numsi <= 2^31 - 1

对于所有有效的 i 都有 numsi != numsi + 1


解题思路:由于题目要求时间复杂度为O(logn),所以第一时间想到二分法

题目中说明了两个边界为无穷小,这个条件非常重要

当我们使用二分法,进行第一次二分时,如果是峰值元素,则可以直接返回所有号

如果numsmid-1>numsmid那么在左半端必有峰值元素,右半端同理

这是因为numsmid-1>numsmid,同时左边界为无穷小。此时在nums0~numsmid中必有峰值元素

就和现实中爬山一样,在numsmid端向左爬,是上山,但最终会下到山底,所以必然会有一个山峰

代码如下所示

java 复制代码
class Solution {
    
    public int findPeakElement(int[] nums) {
        int n=nums.length;
        //两个端点情况
        if(n==1||nums[0]>nums[1]) return 0;
        if(nums[n-1]>nums[n-2]) return n-1;
        //因为两侧都是谷底,所以在nums数组中比nums[mid]大的一侧的一侧必有山峰
        int l=0,r=nums.length,mid=(l+r)/2;
        while(r>l){
            if(nums[mid]>nums[mid+1]&&nums[mid]>nums[mid-1]){
                return mid;
            }
            if(nums[mid]<nums[mid+1]){
                l=mid;
                mid=(l+r)/2;
                continue;
            }
            if(nums[mid]<nums[mid-1]){
                r=mid;
                mid=(l+r)/2;
                continue;
            }
        } 
        return mid;
    }

}
相关推荐
MrZhao4006 分钟前
Agent 长上下文处理机制:Context Compact 与 Memory 的协同
算法
h_a_o777oah16 分钟前
【动态规划】区间 DP :三层循环逻辑与模板实现细节(洛谷 P1880)
c++·算法·动态规划·acm·区间dp·化环为链·石子合并
从此以后自律21 分钟前
迪杰斯特拉
算法
QiLinkOS28 分钟前
第三视觉理解徐玉生与他的商业活动(32)
大数据·c++·人工智能·算法·开源协议
KaMeidebaby39 分钟前
卡梅德生物技术快报|实操手册:CXCL4 蛋白原核表达全套工艺,两步层析去除蛋白多聚体附完整电泳数据
人工智能·算法·机器学习·架构·spark
AIGCmagic社区1 小时前
Unlimited OCR 论文精读:R-SWA 如何实现一次性长文档解析
人工智能·算法·aigc
鹏易灵1 小时前
C++——7.类与对象,掌握封装、继承、多态.详解
开发语言·c++·算法
Mortalbreeze1 小时前
深入 Linux 线程机制(三):线程互斥——竞争条件与互斥锁的本质
linux·运维·服务器·c++·算法
Mr_Controll1 小时前
【运动控制——电子凸轮曲线设计(多项式)】
算法·自动化
Sam09271 小时前
【AI 算法精讲 15】余弦相似度:向量检索与归一化内积
人工智能·python·算法·ai