前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【剑指offer|6.寻找峰值】

【剑指offer|6.寻找峰值】

作者头像
MicroFrank
发布2023-04-12 10:57:05
2030
发布2023-04-12 10:57:05
举报
文章被收录于专栏:同步文章1234

0.寻找峰值

image-20230411002039278
image-20230411002039278

关键点:

  • 返回任意一个峰值的下标即可
  • nums[-1]=nums[n]=负无穷

输入:nums = [1,2,3,1] 输出:2 解释:3 是峰值元素,你的函数应该返回其索引 2

1.傻瓜编程(纯属玩乐)

代码语言:javascript
复制
class Solution {
public:
    int findPeakElement(vector<int>& a) {
        int n=a.size();
        if(n==1)
        {
            return 0;
        }
        if(n==2)
        {
            if(a[0]>a[1])
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }
        for(int i=1;i<n-1;i++)
        {
            if(a[0]>a[1]) return 0;
            if(a[n-2]<a[n-1]) return n-1;
            if(a[i]>a[i-1]&&a[i]>a[i+1]) return i;
        }
        return -1;
    }
};

2.二分

看到题目要求的时间复杂度是o(logN),优先考虑二分查找,但是二分查找的前提似乎要是有序的,其实通过这题我们也能发现,使用二分法不一定要求有序只要求可以确定答案一定会出现在其中一边即可

image-20230411001932419
image-20230411001932419
代码语言:javascript
复制
int findPeakElement(int* nums, int numsSize){
    int left=0,right=numsSize-1;
    while(left<right)//
    {
        int mid=left+(right-left)/2;
        if(nums[mid+1]>=nums[mid])
        {
            left=mid+1;//
        }
        else if(nums[mid+1]<nums[mid])
        {
            right=mid;//
        }
    }
    return left;
}

关键点:

  • 因为mid=(left+right)/2这整数除法的特性,向下取整,只要数组元素个数大于等于2,mid+1下标一定存在(当数组元素等于1的时候,left==right,不会进该循环) , 而mid-1下标不一定存在,mid-1>=0减少边界讨论的情况
  • 注意[left,right] 的范围就是答案所在的区域范围
  • 最后left==right时定位到峰值的位置
image-20230411000822800
image-20230411000822800
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0.寻找峰值
  • 1.傻瓜编程(纯属玩乐)
  • 2.二分
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档