首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >二分查找-162.寻找峰值-力扣(LeetCode)

二分查找-162.寻找峰值-力扣(LeetCode)

作者头像
白天的黑夜
发布2025-10-22 17:07:19
发布2025-10-22 17:07:19
7100
代码可运行
举报
运行总次数:0
代码可运行

一、题目解析

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

2.找到峰值元素并返回索引,如果包含多个峰值,返回任意一个峰值所在位置

3.时间复杂度为O(logN)

二、 算法原理

解法1:暴力解法

 图1表示nums[0]>nums[1],即第一个值就是峰值;图2表示在范围内的某一处出现nums[i]>nums[i+1],即找到峰值;图3表示在数组长度内没有找到nums[i]>nuns[i+1],即峰值为nums[nums.size()-1]
暴力解法即从第一个位置开始,一直向前走,分情况讨论;分析图3我们可以知道暴力解法的时间复杂为O(N),但由于数据长度只有1000,所以暴力解法也是可以通过的

解法2:二分查找

二段性

 细节问题

1.数据长度为1000,暴力解法也能通过
2.数据大小为[-2^31,2^31-1],所以在计算mid的时候可以用long long来存储数据

三、代码示例

解法1:

代码语言:javascript
代码运行次数:0
运行
复制
int findPeakElement(vector<int>& nums)//解法1
    {
        int n = nums.size();
        for(int i = 0;i<n-1;i++)
        {
            if(nums[i]>nums[i+1]) return i;
        }
        return n-1;
    }

解法2:

代码语言:javascript
代码运行次数:0
运行
复制
int findPeakElement(vector<int>& nums)//解法2
    {
        int left = 0,right = nums.size()-1;
        while(left<right)
        {
            long long mid = left + (right-left)/2;
            if(nums[mid]>nums[mid+1]) right = mid;
            else left = mid + 1;
        }
        return right;
    }

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目解析
    • 1.峰值元素是指其值严格大于左右相邻的元素
    • 2.找到峰值元素并返回索引,如果包含多个峰值,返回任意一个峰值所在位置
    • 3.时间复杂度为O(logN)
  • 二、 算法原理
    • 解法1:暴力解法
      •  图1表示nums[0]>nums[1],即第一个值就是峰值;图2表示在范围内的某一处出现nums[i]>nums[i+1],即找到峰值;图3表示在数组长度内没有找到nums[i]>nuns[i+1],即峰值为nums[nums.size()-1]
      • 暴力解法即从第一个位置开始,一直向前走,分情况讨论;分析图3我们可以知道暴力解法的时间复杂为O(N),但由于数据长度只有1000,所以暴力解法也是可以通过的
    • 解法2:二分查找
      • 二段性
    •  细节问题
      • 1.数据长度为1000,暴力解法也能通过
      • 2.数据大小为[-2^31,2^31-1],所以在计算mid的时候可以用long long来存储数据
  • 三、代码示例
    • 解法1:
    • 解法2:
  • 看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档