leetcode做题笔记162. 寻找峰值

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

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

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

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

思路一:二分

c++解法

cpp 复制代码
class Solution {
public:
    int findPeakElement(vector<int>& nums) {
       int left = 0, right = nums.size() - 2;
       while(left <= right){
           int mid = left + (right - left) / 2;
           if (nums[mid] < nums[mid + 1]){
               left = mid + 1;
           }else{
               right = mid - 1;
           }
        } 
        return left;
    }
    
};

java解法

java 复制代码
class Solution {
    public int findPeakElement(int[] nums) {
        int n = nums.length;
        int l = 0, r = n - 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (nums[mid] > nums[mid + 1]) r = mid;
            else l = mid + 1;
        }
        return r;
    }
}

分析:

本题要求数组中的峰值元素,同时要求时间复杂度为O(logn),可以想到用二分解法找到峰值。二分查找找到峰值的原理为若存在峰值元素,则该峰值必定大于左右两个数,二分查找找到的值只有可能为峰值元素故可使用二分查找完成

总结:

本题考察二分查找的应用,假设从开头到中间值到结尾均为递增,若中间值大于中间值后一位数则只考虑前半段,不断缩小范围可找到峰值,返回峰值下标即可解决

相关推荐
致Great1 小时前
科研人的 AI,不该只回答问题:我用字节TraeWork 跑了一遍真实研究任务
算法
纵有疾風起1 小时前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
测试_AI_一辰2 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
Hotchip_MEMS2 小时前
TWS耳机微米级较量:超薄LGA封装如何助力MEMS麦克风小型化?
人工智能·笔记·物联网·电脑
lucas_AI2 小时前
给YOLO检测器插 LoRA,'插对地方'比'插什么'更要命
人工智能·算法
Ztt6666666662 小时前
金泉方壶四面端正,月白釉却把棱角放柔了
经验分享·笔记·其他·百度·微信公众平台
学习和思考2 小时前
非自动化专业如何自学PLC?我的6个月学习路线图
笔记·学习·自动化·学习方法
LuminousCPP2 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil2082 小时前
leetcode 三数之和
数据结构·算法·leetcode
小小龙学IT3 小时前
C++ std::vector 底层实现深度解析:内存布局、扩容策略、移动语义与迭代器失效
开发语言·c++·算法