寻找峰值(二分查找思想)

解法一:暴力求解

int findPeakElement(int* nums, int numsLen ) {// write code herefor (int i = 1; i < numsLen - 1; i++) {if ((nums[i] > nums[i - 1]) && (nums[i] > nums[i+1])) {return i;}}if (nums[numsLen - 1] > nums[numsLen - 2]) {return numsLen - 1;}return 0;
}

题中明确说明:nums[-1] = nums[n] = −∞,所以要特别注意 nums[0] 和 nums[numsLen - 1]

直接遍历数组从 1 到 numsLen-2,要注意边界的问题,当nums[0] > nums[1]时,返回0
当 nums[numsLen - 1](最后一个元素) > nums[numsLen - 2](倒数第二个元素)时,返回numsLen - 1 。

解法二:二分思想

中间比右边大,认为从右往左半边递增,则把 right 不断向左靠拢 right=mid ,注意不能是 mid-1 ,因为这个位置有可能就是峰值点。 直到遇到中间比右边小了,意味着数据开始递降了,则 left 向右偏移, left=mid+1 ; 而一旦 mid+1 位置大于了 right ,意味着刚好这个 mid+1 位置,是一个左半边-右往左递降,右半边-右往左递增的点,就是一个峰值点。

示例:
int arr[] = {3, 5, 4, 4, 3, 2, 1} , 这个数组中两边边界都是非峰值点 int left = 0, right = 6;
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 > right 退出循环, 返回left,也就是1号下标位置。

int findPeakElement(int* nums, int numsLen ) {//边界情况处理,1个元素前后都是负无穷 以及 0号位置大于1号位置,-1位置负无穷的情况if (numsLen == 1 || nums[0] > nums[1])return 0; //末尾位置数据大于上一个位置数据,而nums[numsLen]负无穷的情况if (nums[numsLen - 1] > nums[numsLen - 2])return numsLen - 1;int left = 0, right = numsLen - 1, mid = 0;while (left < right) {mid = left + (right - left) / 2;//中间比右边小,意味着右边肯定有个峰值if (nums[mid] < nums[mid + 1]) {left = mid + 1;}//否则在左边包括当前位置肯定有个峰值else {right = mid;}}return left;
}

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

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

相关文章

ubuntu docker-compose 编排容器并且设置自启动

安装docker-compose sudo apt install docker-compose编写docker-compose.yml 这是我的docker-compose,里面写了5个容器&#xff0c;一个sqlserver的db&#xff0c;一个airlfow&#xff0c;一个我的主项目&#xff0c;会根据里面规定好的启动顺序启动。 version: "3.7&…

蓝桥杯练习系统(算法训练)ALGO-980 斐波那契串

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;10.0s Java时间限制&#xff1a;30.0s Python时间限制&#xff1a;50.0s 问题描述 斐波那契串由下列规则生成&#xff1a;   F[0] "0";   F[1] "1";   F[n] F[n-1] F[n-2]…

鸿蒙开发为什么这么火,现在入行鸿蒙是否来的及?

鸿蒙开发是当前备受关注的技术领域之一&#xff0c;对于想要入门学习鸿蒙开发的初学者来说&#xff0c;需要掌握一定的基础知识和技能。鸿蒙开发又是否能为程序员们带来一片光明的未来呢&#xff1f;让我们一同探讨这些问题。 对于初学者来说&#xff0c;鸿蒙开发是否易于上手呢…

MySQL基础-----多表关系与查询概述

目录 前言 一、多表关系 1.一对多 2.多对多 3.一对一 二、多表查询概述 1.概述 2.笛卡尔积 3.分类 前言 本期我们开始学习新的章节&#xff0c;也就是MySQL的多表关系与查询&#xff0c;在本期主要是讲述概念性的东西&#xff0c;大概介绍多表关系是什么&#xff0c;为什…

洛谷 P1706 全排列问题

题目描述 按照字典序输出自然数 11 到 nn 所有不重复的排列&#xff0c;即 nn 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 nn。 输出格式 由 1 \sim n1∼n 组成的所有不重复的数字序列&#xff0c;每行一个序列。 每个数字…

应用方案 | D54123B低功耗漏电保护电路

概 述 A&#xff09;、D54123B是一款高性能 CMOS 漏电保护器专用电路。芯片内部包含稳压电源、放大电路、比较器电路、延时电路、计数器电路、跳闸控制电路及跳闸驱动电路。芯片外围应用有脱扣线圈、压敏电阻、稳压二级管、二级管、电阻、电容等元器件。 B&#xff09;、内部…

C# 使用DocX生成word文档

1、引用DocX包3.0.0版本 2、引用包 using Xceed.Words.NET; 3、生成word文档 // 保存文档到 Streamvar stream new MemoryStream();// 创建一个新的文档using (var doc DocX.Create("Document")){// 添加页眉doc.AddHeaders();Header header doc.Headers.Odd;/…

docker的快速入门教程

Docker的快速入门教程主要包括以下几个步骤&#xff1a; 一、安装Docker 根据你的操作系统&#xff0c;下载并安装Docker。例如&#xff0c;在Ubuntu下&#xff0c;你可以直接使用apt-get进行安装。在安装完成后&#xff0c;启动Docker服务&#xff0c;并将其设置为开机启动。…

基于SSM SpringBoot vue家教交流平台

基于SSM SpringBoot vue家教交流平台 系统功能 管理员登录 家长登录注册 学生登录注册 教师登录注册 个人中心 家长信息管理 学生信息管理 教师信息管理 招聘家教管理 应聘家教管理 确认招聘管理 论坛管理 系统管理 我的收藏管理 管理员管理 开发环境和技术 开发语言&#x…

宏任务与微任务:JavaScript异步编程的秘密

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

高等数学常用公式

高等数学常用公式 文章目录 内容大纲 内容 大纲 感谢观看 期待关注 有问题的小伙伴请在下方留言&#xff0c;喜欢就点个赞吧

并发容器介绍(二)

并发容器介绍&#xff08;二&#xff09; 文章目录 并发容器介绍&#xff08;二&#xff09;BlockingQueueBlockingQueue 简介ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue ConcurrentSkipListMap 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 Bl…

c语言:甲流疫情死亡率

甲流疫情死亡率 任务描述 甲流并不可怕&#xff0c;在中国&#xff0c;它的死亡率并不是很高。请根据截止2009年12月22日各省报告的甲流确诊数和死亡数&#xff0c;计算甲流在各省的死亡率。 输入格式: 输入仅一行&#xff0c;有两个整数&#xff0c;第一个为确诊数&#xf…

YOLO V9 C++版本部署

文章目录 一、环境配置二、编译三、运行yolo四、测试效果 一、环境配置 下载MNN git clone https://github.com/alibaba/MNN.git下载MNN-YOLO git clone https://github.com/wangzhaode/mnn-yolo.git二、编译 ### compile mnn ### cd MNN mkdir build_s cd build_s/ cmake …

算法刷题Day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

目录 0 哈希表 哈希函数1 有效的字母异位词1.1 string的回顾1.2 我的代码 2 两个数组的交集2.1 unordered_set 介绍2.2 我的解题&#xff08;set&#xff09; 3 快乐数3.1 我的解题&#xff08;set&#xff09; 4 两数之和4.1 暴力求解4.2 哈希表&#xff08;map&#xff09; &…

vue-cli自定义创建项目-eslint依赖冲突解决方式

创建项目步骤 概览&#xff1a; 在安装 npm安装时会报错 npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: vue/eslint-config-standard6.1.0 npm ERR! Found: eslint-plugin-vue8.7.1 npm ERR! node_modules/eslint-plugin…

公网ip和局域网ip

什么是公网IP&#xff1f; 公网&#xff0c;俗称外网&#xff0c;又被叫做互联网&#xff0c;是连接不同地区局域网或者城域网计算机的通信的远程网络。通常可以跨接很大的物理范围&#xff0c;连接多个地区、城市和国家提供远距离通信&#xff0c;形成全球性的互联网络。因此…

开源好用的所见即所得(WYSIWYG)编辑器:Editor.js

文章目录 特点基于区块干净的数据 界面与交互插件标题和文本图片列表Todo表格 使用安装创建编辑器实例配置工具本地化自定义样式 今天介绍一个开源好用的Web所见即所得(WYSIWYG)编辑器&#xff1a; Editor.js Editor.js 是一个基于 Web 的所见即所得富文本编辑器&#xff0c;它…

爬虫怎么使用代理IP通过HTML和CSS采集数据?

使用爬虫采集数据时&#xff0c;有时为了隐藏真实IP地址或规避某些网站的限制&#xff0c;我们需要使用代理IP。同时&#xff0c;通过HTML和CSS选择器&#xff0c;我们可以定位并提取页面中的特定数据。以下是一个基本的步骤说明&#xff0c;以Python的requests和BeautifulSoup…

nodejs版本过高导致vue-cli项目无法正常运行解决方案

95% emitting CompressionPlugin ERROR Error: error:0308010C:digital envelope routines::unsupported 方法一&#xff1a;在使用 npm run dev之前使用 set NODE_OPTIONS--openssl-legacy-provider Error: error:0308010C:digital envelope routines::unsupported 解决方法…