首页 > 其他分享 >162. 寻找峰值(中)

162. 寻找峰值(中)

时间:2024-03-09 11:34:15浏览次数:28  
标签:nums 元素 mid 峰值 寻找 数组 162 left

目录

题目

  • 峰值元素是指其值严格大于左右相邻值的元素。
    给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
    你可以假设 nums[-1] = nums[n] = -∞ 。
    你必须实现时间复杂度为 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。

题解:二分

class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        if nums is None:
            return -1
        if len(nums)==1:#数组中唯一的元素可以被认为是峰值
            return 0
        left=0
        right=len(nums)-1
        while left<=right:#直到left>right跳出循环
            mid=left+(right-left)//2
            if mid<len(nums)-1 and nums[mid]>nums[mid-1] and nums[mid]>nums[mid+1]:#确保mid+1 是一个有效的索引,如果mid的值比左右两边都大,满足峰值直接返回
                return mid
            elif mid==len(nums)-1 or nums[mid]>nums[mid+1]:#当mid为最后一个元素时,mid+1会溢出,所以加上mid==len(nums)-1判断
            #当mid的值大于mid+1,说明右边元素不大于mid,峰值在左边,更新右指针的值,把范围缩在左边
                right=mid-1
            else:
                left=mid+1
        return left #如果没有找到峰值,当数组递增时,left指向最后一个元素;当数组递减时,left指向第一个元素
  • 会遇到越界的情况,注意加上限制判断

为什么是比较mid和mid+1在数组中的值,而不像标准的二分模板比较的是mid和left/right来缩小寻找范围?
一开始我们可以这样写,当遇到1213564这个测试案例的时候就明白了,中间元素与左右比较并不能得到某一边有序,而缩小范围。
所以还是按照题目意思峰值元素是比左右两边都大的元素,依次做判断条件

标签:nums,元素,mid,峰值,寻找,数组,162,left
From: https://www.cnblogs.com/lushuang55/p/18061125

相关文章

  • 洛谷题单指南-搜索-P1162 填涂颜色
    原题链接:https://www.luogu.com.cn/problem/P1162题意解读:要把闭合圈内的0填为2,DFS处理即可。解题思路:由于方阵内只有一个闭合圈,所以闭合圈以外的0一定和边缘相连通,只需要从边缘开始,把0的连通块全部标记为2最后再输出时,2输出0,1输出1,0输出2,即可得解。100分代码:#include<bits......
  • LY1162 [ 20230323 CQYC省选模拟赛 T3 ] 跳!跳!跳!
    题意给定\(n\)个长度为\(m\)的字符串,进行若干操作,求每个字符串\(S_a\)到\(S_b\)的方案数。另外,你还有一个模式串\(T\),由\({1,...,n}\)与\(0\)(通配符)组成。从\(S_x\)右边的串开始,不断向右移动,直到\(S_y\)与\(T\)匹配。从\(S_x\)左边的串开始,不断向左......
  • 第十一届蓝桥杯试题B:寻找2020
    目录题目题解:暴力题目题解:暴力需要知道文件的操作;发现2020的行列标变化li=[]#创建一个空列表用于存储读取的文本内容withopen(r'2020.txt','r')asfp:#打开名为'2020.txt'的文件,并使用文件句柄fpforlineinfp.readlines():#逐行读取文件内容......
  • 如何高效寻找素数
    目录题目暴力优化埃拉托斯特尼素数筛选法题目输入n,返回[2,n)中素数的个数暴力从2开始到n,一个一个判断是不是素数,是的话就计数器加1。判断素数函数:从2开始到n,判断有没有是n的倍数,有倍数就不是素数defcountPrimes(n:int):count=0foriinrange(2,n):......
  • Educational Codeforces Round 162 E 点分治 虚树 树形dp
    传送门给出\(n\le2\cdot10^5\)的一棵树,每个节点有一个颜色。求出路径长度为\(2\)路径首端和尾端拥有相同颜色,且路径上其他点不存在相同颜色的点的路径条数。当时看错题了,把颜色抽出来后没法做了。后来感觉能点分治,然后把题看对了,遂写了一个极其抽象的点分治。除此之外,把某......
  • 在github开源市场如何高效寻找优秀开源项目
    作为程序员,不论是开发还是学习,肯定会用到开源项目,那么怎么快速在开源网站找到这些项目呢?常用的开源网站有:github和giteegithub是全球最大的开源社区,今天就以github为例,演示一下github界面一般来说,优秀的项目,维护会比较频繁,提交数也就会多一点。当然,一个好的项目,它......
  • 高速脉冲峰值检测系统
    产品简介:♦该系统是基于串口传输的采集系统,双通道8bitAD同步采集,每通道5GSPS,或者8通道,每通道1.25GSPS同步集采。♦板载1GBDDRIII内存,通过RS232与计算机串口进行通信。更多信息请加weixin-pt890111获取该系统是基于串口传输的采集系统,双通道8bitAD同步采集,每通道5GSPS,或者8通......
  • 10个技巧,3分钟教会你github高效寻找开源项目
    大家好,我是知微!作为程序员,不论是开发还是学习,肯定会用到开源项目,那么怎么快速在开源网站找到这些项目呢?常用的开源网站有:github和giteegithub是全球最大的开源社区,今天就以github为例,演示一下github界面一般来说,优秀的项目,维护会比较频繁,提交数也就会多一点。当......
  • 买卖股票的最佳时机——差值的最值的遍历寻找
    题目描述:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。(1)只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算所能获取的最大利润。返回可以从这笔交易中获取的最大利润。如果不能获取任何利润......
  • 数组构建_cfECR162_C. Find B
    目录问题概述思路分析参考代码问题反思问题概述原题参考:C.FindB对于一个数组a,给出m次咨询,问对于每一次询问的区间是否可以构建出另外一个好的数组b,对于a的好数组的定义是a数组和b数组的元素和相同a数组和b数组的每一位不同b数组的每一位是正数思路分析对于第一个条件......