【算法日志】非排序数组的二分查找应用

文章目录


前言

二分查找是一种比较简单且基础的查找算法,多用于排序数组的快速查找。但其实二分查找也有非排序数组的应用。


引例

Leetcode162 寻找峰值

本题是一道经典的二分查找算法题,要求找到一个比左右相邻值大的峰值。如果用暴力解法,则时间复杂度为O(n),不符合题目时间复杂度的要求。

那么我们应如何降低本题的时间复杂度呢,答案是使用二分查找。

我们先找的中间下标mid。然后再和右边相邻值比较。因为本题相邻两个值不相等,则如果nums[mid] < nums[mid + 1]
则mid的mid + 1的数值呈一个上升趋势,则一定有一个极大值在mid的右边,于是我们可以把left角标收缩到mid。
如果nums[mid] > nums[mid - 1]
同理在mid的左侧有一个极大值。否则nums[mid]本身就是一个极大值。

这种类似于二分差找收缩取值范围的思想能够有效降低本题的时间复杂度。

示例代码如下

	int findPeakElement(vector<int>& nums){int left = -1, right = nums.size() - 1;//这里暂定right是要取的值while (left + 1 < right){int mid = left + (right - left) / 2;if (nums[mid] > nums[mid + 1])right = mid;//这里使right一定取一个较大值,且使这个较大值被排除区间之外else//nums[mid] < nums[mid + 1]//较大值要么在区间之内,要么在right上,这样right边能收敛到这个值上left = mid;}return right;}

当然本题也可以扩展到二维二分查找。

Leetcode1901寻找峰值2

示例代码

	int indexOfMax(const vector<int>& vec){return max_element(vec.begin(), vec.end()) - vec.begin();}vector<int> findPeakGrid(const vector<vector<int>>& mat){int n = mat.size();int m = mat[0].size();int left = -1, right = n - 1;while (left + 1 < right){int mid = left + (right - left) / 2;int maxj = indexOfMax(mat[mid]);if (mat[mid][maxj] > mat[mid + 1][maxj])right = mid;elseleft = mid;}return { right, indexOfMax(mat[right]) };}

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

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

相关文章

安卓手机语音备忘录在哪里?

我们在日常生活和工作中&#xff0c;使用手机记事的时候&#xff0c;不仅需要在备忘录或便签软件中记录文字、图片&#xff0c;有时候我们也需要记录语音或音频文件。那么安卓手机语音备忘录在哪里呢&#xff1f;其实绝大多数的安卓手机中都是没有专门的语音备忘录的&#xff0…

科聪控制系统典型应用车型 —— 料箱机器人

料箱机器人即料箱AGV是一种智能化物流搬运设备&#xff0c;它可以代替人力完成出库入库和搬运工作&#xff0c;可根据出入库生产出货需求&#xff0c;将货物从起点运送到终点&#xff0c;自动柔性完成货到人货到点的操作。 提升仓储和物流效率的自动化利器 料箱机器人的投用能…

最新ChatGPT网站系统源码+AI绘画系统+支持GPT语音对话+详细图文搭建教程/支持GPT4.0/H5端系统/文档知识库

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

服务器解析漏洞有哪些?IIS\APACHE\NGINX解析漏洞利用

解析漏洞是指在Web服务器处理用户请求时&#xff0c;对输入数据&#xff08;如文件名、参数等&#xff09;进行解析时产生的漏洞。这种漏洞可能导致服务器对用户提供的数据进行错误解析&#xff0c;使攻击者能够执行未经授权的操作。解析漏洞通常涉及到对用户输入的信任不足&am…

零刻EQ12 N100 双2.5G网口 All In One新手教程

零刻EQ12 N100 双2.5G网口 All In One新手教程 前言1.硬件配置2.准备工作2.1. ESXI8.0U2镜像2.2. Rufus磁盘工具下载2.3. ikuai镜像下载2.4. StarWindConverter虚拟磁盘格式转换工具下载2.5. OpenWrt镜像下载2.6. 黑群晖RR引导镜像下载(DSM7.2)2.7. 需要准备的硬件2.8. 格式化需…

Backend - Django 项目创建 运行

目录 一、配置环境 二、创建 Django 项目 &#xff08;一&#xff09;新建文件夹 &#xff08;二&#xff09;打开文件夹 &#xff08;三&#xff09;打开运行终端 &#xff08;四&#xff09;创建基础项目 &#xff08;五&#xff09;创建app 1. 安装Django &#xf…

MVVM响应式

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介MVVM响应式1. 什么是MVVM模式?2. Vue中的响应式数据3. 数据绑定与视图更新⭐ 写在最后⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习…

Tomcat为什么要重写类加载器?

文章目录 一、双亲委派机制二、分析1、Tomcat需要隔离性2、Tomcat需要热替换3、打破双亲委派机制 三、Tomcat类加载器1、拓展类加载器2、工作原理 四、总结 一、双亲委派机制 首先了解下双亲委派机制&#xff0c;大致过程如下&#xff1a; 简单来说&#xff0c;就是加载class…

【中小型企业网络实战案例 一】规划、需求和基本配置

热门IT技术【视频教程】https://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 案例拓扑图 案例需求 在中小园区中&#xff0c;S5735通常部署在网络的接入层&#xff0c;S8700通常部署在网络的核心&#xff0c;出口路由器一般选用AR系列路由器。 …

三、e2studio VS STM32CubeIDE之瑞萨RA FSP5.0.0裸机printf重定向

一、概述/目的 二、fsp4.6.0之前printf重定向方法 三、fsp5.0.0之后printf重定向方法 3.1 升级后编译报错 3.2 分析原因 3.2.1 newlib和gcc版本 3.2.2 参考stm32cube ide 3.3 处理办法 3.3.1 方法一 3.3.2 方法二 三、e2studio VS…

❀My虚拟机上的ftp服务器搭建(centos)❀

❀My虚拟机上的ftp服务器搭建(centos)❀ 在CentOS上搭建FTP服务器可以使用vsftpd软件&#xff0c;下面是详细的搭建教程&#xff1a; ①安装vsftpd软件 在终端中输入以下命令进行安装&#xff1a; sudo yum install vsftpd ②配置vsftpd 打开vsftpd的配置文件&#xff0c;…

python医学科研中能做什么,python对医学专业的作用

大家好&#xff0c;小编为大家解答python在医学研究中的运用的问题。很多人还不知道python医学科研中能做什么&#xff0c;现在让我们一起来看看吧&#xff01; 原标题&#xff1a;这个工具&#xff0c;可全网爬取科研圈中外文献&#xff01; 作为「科研汪」&#xff0c;你是不…