Find Peak Element

2023-10-29

A peak element is an element that is greater than its neighbors.

Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

You may imagine that num[-1] = num[n] = -∞.

For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.

 这也是一道神奇的题目,原本来源是geeksforgeeks,题目提示用对数时间来时间,基本只有二分了。另外题意是找到其中一个peak element,不是全部或者全局的peak元素,这也是可以使用二分的保证。另外题目提示num[-1]=num[n]=-∞也就是如果数组开头为递减序列或者结尾为递增序列,则num[0]或num[n-1]可以作为peak返回。具体思路不再是考虑left和right这样的boundary元素,而是考虑mid-1和mid+1来判断mid左边和右边的子数组的趋势。

如果num[mid-1]<num[mid]并且num[mid+1]<num[mid]。则mid本身就是一个peak元素,可以直接返回。而num[mid-1]>num[mid]时,说明左边数组有递减的趋势。如果一直是递减,则num[0]符合peak的条件,如果是先递增后递减,则可以在这块二分找到这个元素,总结就是此时取左半数组,r=mid。而当num[mid+1]>num[mid]时,可以得到类似分析,右半数组有递增趋势,如果一直递增则num[n-1]符合peek的条件,如果先递增后递减则可以通过二分找到这个数字,所以此时取右半数组,令l=mid。代码如下:

class Solution(object):
    def findPeakElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0
            
        l = 0
        r = len(nums)-1
        
        while l+1 < r:
            mid = l + (r-l)/2
            if nums[mid] < nums[mid-1]:
                r = mid
            elif nums[mid] < nums[mid+1]:
                l = mid 
            else:
                return mid 
        if nums[l] < nums[r]:
           return r
        else:
           return l

最后剩余两个元素,所以需要考虑下到底哪个是。时间复杂度为O(logn)

简化加速版本,在左侧找降的趋势,在右侧找升的趋势.题意保证左侧有降的在一定有peak,右侧有升的,则一定也有peak.

class Solution(object):
    def findPeakElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return -1
        l = 0
        r = len(nums) - 1
        while l + 1 < r:
            mid = l + (r -l)/2
            if nums[mid-1] >  nums[mid]:
                r = mid
            else:
                l = mid
        if nums[l] > nums[r]:
            return l
        else:
            return r

 

转载于:https://www.cnblogs.com/sherylwang/p/5496555.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Find Peak Element 的相关文章

随机推荐

  • 【论文阅读翻译】Action Assessment by Joint Relation Graph

    论文阅读翻译 Action Assessment by Joint Relation Graph KeyWords Abstract Introduction Related Work Approach Experiment KeyWord
  • docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)

    参考文章 学习笔记 尚硅谷周阳老师的Docker教程学习笔记 一 容器数据卷 1 容器数据卷 1 什么是容器数据卷 容器删除后数据自然也就没有了 所以用卷来保存数据 容器数据卷功能是持久化和数据共享 卷就是目录或文件 存在于一个或多个容器中
  • springboot中ElasticSearch入门与进阶:组合查询、Aggregation聚合查询(你想要的都有)

    1 springboot中配置elasticSearch 1 1在工程中引入相关的jar包 1 1 1 在build gradle中添加需要的jar包 我创建的gradle工程 对应的maven工程也是一样 添加对应的jar包即可 添加 S
  • linux shell 时间运算以及时间差计算方法

    最近一段时间 在处理Shell 脚本时候 遇到时间的处理问题 时间的加减 以及时间差的计算 1 时间加减 这里处理方法 是将基础的时间转变为时间戳 然后 需要增加或者改变时间 变成 秒 如 1990 01 01 01 01 01 加上 1小
  • 3D人脸模型Flame ----《Learning a model of facial shape and expression from 4D scans》论文讲解及代码注释

    前文 在阅读论文前 首先我们要有一定的知识储备 包括人脸建模 表情制作 旋转转换等 才能方便我们的论文理解 所以首先我会讲解一些关键的知识点 Flame模型的作用 Flame是一个3D人脸的通用模型 举个例子 你现在有一个特定人的3D人脸扫
  • LeetCode练习笔记

    c 解法 文章目录 1 两数之和 简单 题目 方法一 两遍哈希表 方法二 一遍哈希表 2 整数反转 中等 题目 解题方法 3 无重复字符的最长子串 中等 解题方法 4 寻找两个正序数组的中位数 难 解题方法 5 腾讯 6 字节跳动 7 腾讯
  • GCC/CLANG编译器

    文章目录 编译指令 编译过程 预处理 生成汇编代码 词法分析 语法分析 语义分析 生成中间代码 代码生成 LLVM IR 汇编 链接 lib库的链接 clang 编译指令 链接方式 将OC反编译为C GCC是在linux下使用的编译器 Cl
  • Research Productivity Index-概率dp

    题目描述 Angela is a new PhD student and she is nervous about the upcoming paper submission deadline of this year s research
  • 百度又发布一个神器!网友直呼好家伙

    目标检测作为计算机视觉领域的顶梁柱 不仅可以独立完成车辆 商品 缺陷检测等任务 也是人脸识别 视频分析 以图搜图等复合技术的核心模块 在自动驾驶 工业视觉 安防交通等领域的商业价值有目共睹 正因如此 YOLOv5 YOLOX PP YOLO
  • 你了解这些算法吗?SHA256、RIPEMD-160、DES、AES、RSA、ECC

    一 HASH算法 哈希散列算法和哈希摘要算法都叫做哈希算法 1 概念 把一段任意长度的数据变成均匀分布固定长度的数据 反之不可以 Hash不可逆 在任何电脑 手机 或者笔算Hash值都是一样的 y Hash x 已知x可以得到y 反之不可以
  • 【ElasticSearch系列连载】7. 关于ES数据读写那点事儿

    1 对文档建索引 1 1 自定义文档ID 如果数据本身有自己的唯一标记 那么在建立索引时可以使用id来指定文档的id 如下 使用curl在your index索引下写入一个id 1001的文档 curl H Content Type app
  • 归并排序 笔试面试手写代码常考

    归并排序是将两个或者两个以上的有序序列进行合并的一种排序算法 采用了分治的思想 它的主要思路是将序列分为两个子序列 对于两个最终有序的子序列进行合并 得到有序的整体序列 如何保证子序列有序呢 对子序列采用同样的方式进行划分 当子序列长度为1
  • 一文看懂人工智能芯片的产业生态及竞争格局

    近日 国内人工智能芯片公司寒武纪科技 Cambricon 获得了一亿美元A轮融资 是目前国内人工智能芯片领域初创公司所获得的最高融资记录 如果要说这桩融资对人工智能领域的最直接意义 或许是让人工智能芯片逐渐走入了更多人的视野 深度学习不仅在
  • linux centos 系统提示No space left on device错误 centos清理硬盘空间

    一 问题描述 线上的一个centos系统 硬盘满了 通过以下方式清理后 启动程序还是会提示No space left on device错误 具体请看解决方法 这里讲下如何清理硬盘 1 查看系统磁盘是否已满 df h 看哪个目录use到10
  • LeetCode每日刷题:两个数组的交集

    题目 给你两个整数数组 nums1 和 nums2 请你以数组形式返回两数组的交集 返回结果中每个元素出现的次数 应与元素在两个数组中都出现的次数一致 如果出现次数不一致 则考虑取较小值 可以不考虑输出结果的顺序 解题思路 双指针 排序 先
  • 单向散列函数介绍

    一 点睛 单向散列函数有一个输入和一个输出 其中输入称为消息 输出称为散列值 单向散列函数可以根据消息的内容计算出散列值 而散列值就可以被用来检查消息的完整性 单向散列函数根据消息的内容计算出散列值 这里的消息不一定是人类能够读懂的文字 也
  • Yolov5s/Yolov8s网络结构图

    一 网络模型配置 Yolov5s Parameters nc 1 number of classes depth multiple 0 33 model depth multiple width multiple 0 50 layer ch
  • 【AntDB数据库】AntDB数据库价值优势

    AntDB数据库的技术优势 Oracle语法兼容 AntDB与Oracle数据库高度兼容 使得企业现有的基于Oracle数据库开发的应用程序无需做任何修改或只做少量的修改便可以运行在AntDB平台之上 由此降低了程序迁移的风险 减少了重写应
  • Spring Data Jpa之JAP注解+多表设计

    1 JPA注解的使用 package com example jpademo entity import javax persistence Entity 标记该类是一个实体类 指定表名 当实体类名称与表名一致时 可以省略不写 Table
  • Find Peak Element

    A peak element is an element that is greater than its neighbors Given an input array where num i num i 1 find a peak ele