牛客网 NC107 寻找峰值

news2024/11/15 18:38:48

前言:内容包括四大模块:题目,代码实现,大致思路,代码解读

题目:

描述

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。

1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于

2.假设 nums[-1] = nums[n] = −∞

3.对于所有有效的 i 都有 nums[i] != nums[i + 1]

4.你可以使用O(logN)的时间复杂度实现此问题吗?

如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:

示例1

输入:

[2,4,1,2,7,8,4]

返回值:

1

说明:

4和8都是峰值元素,返回4的索引1或者8的索引5都可以     

示例2

输入:

[1,2,3,1]

返回值:

2

说明:

3 是峰值元素,返回其索引 2    

代码实现:

 

int findPeakElement(int* nums, int numsLen ) 
{
    // write code here
    if(numsLen==1 || nums[0]>nums[1])
    {
        return 0;
    }
    if(nums[numsLen-1]>nums[numsLen-2])
    {
        return numsLen-1;
    }
    int left = 0;
    int right = numsLen-1;
    int mid = 0;
    while(left<right)
    {
        mid=left+(right-left)/2;
        if(nums[mid]>nums[mid+1])
        {
            right=mid;
        }
        else
        {
            left=mid+1;
        }
    }
    return left;
}

大致思路:

采用二分查找

初始化:left作为第一个元素的下标,left=0

               right作为最后一个元素的下标,right=元素个数-1

1 中间值比右边大,认为是向左递增的,则要使得范围向左边靠,right=mid

注意:不要right=mid-1,因为mid下标的值也有可能是峰值

2. 中间值比右边小,认为是开始递减了,则要使得范围向右边靠,left=mid+1

    直至left不再小于right,则left下标的值即是峰值

示例:int arr[] = {3, 5, 4, 4, 3, 2, 1}

left=0,right=6,mid=3: arr[3]=4 > arr[4]=3, 则right = mid = 3; 从右往左是递增的
left=0,right=3,mid=1: arr[1]=5 > arr[2]=4, 则right = mid = 1; 从右往左是递增的
left=0,right=1,mid=0: arr[0]=3 < arr[1]=5, 则left = mid + 1 = 1; 从右往左开始递降了

此时left=1,right=1,left不再小于right,循环停止,找到了峰值5,返回下标left

注意:循环的条件不能是left<=right,以如上数组为例:此时已经找到峰值5,left=right=1,若是循环条件是left<=right,则还会进入循环,进行二分查找:

        mid=left+(right-left)/2;
        if(nums[mid]>nums[mid+1])
        {
            right=mid;
        }

满足以上条件,进入if语句,right=mid=1,再去判断部分left<=right的,则又重复以上逻辑

死循环

代码解读:

part 1:处理边界情况

    if(numsLen==1 || nums[0]>nums[1])
    {
        return 0;
    }
    if(nums[numsLen-1]>nums[numsLen-2])
    {
        return numsLen-1;
    }

若是数组只有一个元素or数组的第一个元素>第二个元素

则下标为0的值是峰值,因为题目告知: nums[-1] = nums[n] = −∞

part 2:二分查找峰值

    int left = 0;
    int right = numsLen-1;
    int mid = 0;
    while(left<right)
    {
        mid=left+(right-left)/2;
        if(nums[mid]>nums[mid+1])
        {
            right=mid;
        }
        else
        {
            left=mid+1;
        }
    }
    return left;

定义下标left和right,left开始是第一个元素的下标,right开始是最后一个元素的下标

若是中间值>右边,则认为是从右向左递增,故而我们使范围向左边靠,right=mid

若是中间值<右边,则认为从右向左开始递减了,故而峰值出现在右边,范围要向右边靠,left=mid+1

直至某一次循环中left不再小于right,则说明找到了峰值,结束了循环,返回left的下标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue-router路由配置

介绍&#xff1a;路由配置主要是用来确定网站访问路径对应哪个文件代码显示的&#xff0c;这里主要描述路由的配置、子路由、动态路由&#xff08;运行中添加删除路由&#xff09; 1、npm添加 npm install vue-router // 执行完后会自动在package.json中添加 "vue-router…

某游戏辅助功能分析

FPS游戏发展至今&#xff0c;阻挡外挂开发者脚步的往往不是数据和功能开发&#xff0c;而是高难度的检测。 现如今&#xff0c;检测的手段越来越多&#xff0c;也越来越五花八门。列如&#xff1a; 检测参数&#xff0c;检测堆栈&#xff0c;检测注入等等。 CRC是众多检测手段中…

Qt OpenGL(三十九)——Qt OpenGL 核心模式-在雷达坐标系中绘制飞行的飞机

提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十九)——Qt OpenGL 核心模式-在雷达坐标系中绘制飞行的飞机 一、场景 在之前绘制完毕雷达显示图之后,这时候,我们能匹配的场景就更广泛了,比如说…

string类模拟实现

了解过string常用接口后&#xff0c;接下来的任务就是模拟实现string类。 目录 VS下的string结构 默认成员函数和简单接口 string结构 c_str()、size()、capacity()、clear()、swap() 构造函数 拷贝构造函数 赋值重载 析构函数 访问及遍历 容量操作 reserve resize …

C语言(typedef,函数和指针)

目录 一.typedef 二.函数和指针 一.typedef typedef是一种高级数据特性&#xff0c;利用typedef可以为某一类型自定义名称。typedef创建的符号名只受限于类型 typedef unsigned char BYTE; BYTE x 这里的BYTE就相当于unsigned char x typedef unsigned char *BYTE; BYTE x,…

[oeasy]python0082_VT100_演化_颜色设置_VT选项_基础色_高亮色_索引色_RGB总结

更多颜色 回忆上次内容 上次 了解了控制序列 背后的故事 一切标准 都是 从无到有 的就连 负责标准的组织 也是 从无到有 的 VT-05 奠定了 基础颜色 黑底 绿字隔行 扫描 但 多颜色设置 是如何出现 的呢&#xff1f;&#xff1f;&#x1f914; 控制字符 1974年 产品 从VT05…

语音识别系列之脉冲神经网络特征工程

人工神经网络&#xff08;Artificial Neural Network, ANN&#xff09;中的单个人工神经元是对生物神经元的高度抽象、提炼和简化&#xff0c;模拟了后者的若干基本性质。得益于误差反向传播算法&#xff0c;网络权重可根据设定的目标函数得到有效地调整&#xff0c;ANN在视觉、…

LeetCode初级算法题(Java):反转链表+统计N以内的素数+删除排序数组中的重复项

文章目录1 反转链表1.1 题目1.2 解题思路解法1&#xff1a;迭代解法2&#xff1a;递归1.3 题解代码2 统计N以内的素数2.1 题目2.2 解题思路与题解代码解法1&#xff1a;暴力算法代码展示解法1&#xff1a;埃氏筛代码展示3 删除排序数组中的重复项3.1 题目3.2 解题思路3.3 题解代…

近红外染料标记小分子1628790-37-3,Cyanine5.5 alkyne,花青素CY5.5炔基

试剂基团反应特点&#xff1a;Cyanine5.5 alkyne用于点击化学标记的远红外/近红外染料炔烃。氰基5.5是Cy5.5的类似物&#xff0c;一种流行的荧光团&#xff0c;已广泛用于各种应用&#xff0c;包括完整生物体成像。在温和的铜催化化学条件下&#xff0c;该试剂可与叠氮基共轭&a…

构建RFID系统的重要组成部分

RFID读写设备&#xff0c;通常被用来扫描读取安装了RFID电子标签的目标物品&#xff0c;能实现快速批量无接触读写&#xff0c;是构建RFID系统的重要组成部分。RFID读写设备&#xff0c;通常有固定式读写设备和可移动读写设备两种。下面来了解一下RFID的特点&#xff0c;RFID系…

EZ-Cube简易款下载器烧写使用方法

一、硬件连接 跟目标芯片接4根线 VCC、GND、TOOL、REST 四根线&#xff0c;如果板子芯片自己外接电源的&#xff0c;VCC 线可以不接。 二、 安装烧写软件和驱动 烧写软件&#xff1a;https://download.csdn.net/download/Stark_/87444744?spm1001.2014.3001.5503 驱动程序&a…

java微信小程序的在线学习平台

本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对在线学习平台进行需求分析,得出在线学习平台主要功能。接着对在线学习平台进行总体设计和详细设计。总体设计主要包括小程序功能设计、小程…

Apache JMeter 5.5 下载安装以及设置中文教程

Apache JMeter 5.5 下载安装以及设置中文教程JMeter下载Apache JMeter 5.5配置环境变量查看配置JDK配置JMeter环境变量运行JMeter配置中文版一次性永久设置正文JMeter 下载Apache JMeter 5.5 官方网站&#xff1a;Apache JMeter 官网 版本介绍&#xff1a; 版本中一个是Bina…

TCP协议 ---可靠传输的各种机制

目录 一、可靠 确认应答机制&#xff1a;保证数据可靠、有序的到达对端 超时重传机制 二、效率 2.1 提高自身发送数据量 滑动窗口机制&#xff1a; 滑动窗口的发送缓冲区是环形队列 滑动窗口的大小会变化吗&#xff1f; 滑动窗口的nb之处 滑动窗口丢包问题 2.2 对方…

锻炼管理器wger的安装

本文是 2021 年 2 月完成的&#xff0c;最近因为工作比较忙&#xff0c;就把这些老文章翻出来&#xff0c;但为了发表&#xff0c;老苏差不多又重写了一遍。 因为当时跑的是 wger/apache &#xff0c;现在新的 wger/apache 版本在老苏的机器上&#xff0c;会遇到 AH00141: Coul…

Windows Git Bash 配置

Windows Git Bash 配置 本文参考的文章&#xff1a; 在 Windows 的 Git Bash 中使用包管理器 - iris (ginshio.org)Git bash 安装 pacman & Windows 解压 zst 文件 | 伪斜杠青年 (lckiss.com) 一、Git的安装 Git 的安装应该是都会的&#xff0c;但还是应该说以下&#…

前端常见基础面试题css篇

目录 1.css3有哪些新特性&#xff1f; 2.CSS有哪些基本选择器&#xff1f;它们的权重是如何表示的&#xff1f; 3.css 选择器的类型优先级排序 4.写出几种CSS实现元素两个盒子垂直水平居中的代码 5.CSS 常见的伪类和伪元素有哪些? 6.CSS的引入方式有哪些&#xff1f;ink…

CMMI-外包与采购管理

外包与采购管理&#xff08;Outsourcing and Procurement Management, OPM&#xff09;是指外包管理和采购管理&#xff0c;目的是选择合适的承包商和供应商&#xff0c;并依据合同进行有效的管理。外包与采购管理过程域是SPP模型的重要组成部分。本规范阐述了外包与采购管理过…

自定义认证器

自定义认证器工作流程 1、设备向AWS IoT发送http请求&#xff0c;包含token和token签名 2、IoT判断这是一个自定义认证请求&#xff0c;然后确认token和token签名是否匹配 3、Lambda函数验证token之后&#xff0c;将输出5项数据&#xff0c; isAuthenticated&#xff1a;求是…

Zookeeper入门与应用

Zookeeper入门与应用1.简介1.1.应用场景1.2.Zookeeper的设计目标1.3数据模型2. 单机安装3.常用shell命令3.1.查询3.2.创建3.3.更新3.4.删除4.zookeeper的Acl权限控制案例/远程登录acl 超级管理员5.zookeeper的 JavaAPI连接到Zookeeper5.1.新增节点5.2.修改节点5.3.删除节点5.4.…