二分查找核心思路--单调性--极值

news/2025/2/22 23:31:34/

在最初的二分查找中,我们将一组数据按大小排序,然后根据arr[mid]与要查找的k的大小比较,从而每次去掉一半的数字,使时间复杂度简化为O(logN)。

排序本质上是让数据的单调性统一,变为单增或单减,而不是混合的。

下面我们看一道好题:

寻找峰值_牛客题霸_牛客网

 

找出两个山峰,山峰是一个比两边都大的数字,也就是这组数据的极大值(极值点是坐标)

   //处理两个边界if(numsLen==1||nums[0]>nums[1]){return 0;}if(nums[numsLen-1]>nums[numsLen-2]){return numsLen-1;}

数据的首尾比较好判断,且题目中规定越界的部分为负无穷,我们可以先将这两部分判断好。

确保首尾均不是极值后,我们可以得到下图。

两边向下的箭头:代表靠近首尾边界时,均为单调递减 。即left<left+1对应的值,right<right-1对应的值。

然后我们对中间的值与其附近的值进行比较。这里我假设arr[mid]<arr[mid+1],则中间向右位置是单调递增的,而右边部分可以近似理解为连续的函数(实际上是数列),一开始单增,导数>0,最后单减,导数<0,则其中必定有导数=0的极值点,因此我们就可以确定mid向右部分一定存在峰值

然而,对于左半边的部分,起始和终止均为单增,单调性一致,无法确定是否存在峰值。

int findPeakElement(int* nums, int numsLen )
{//处理两个边界if(numsLen==1||nums[0]>nums[1]){return 0;}if(nums[numsLen-1]>nums[numsLen-2]){return numsLen-1;}int i=0;int left=0;int right=numsLen-1;int mid=0;while(left<right){mid=(right-left)/2+left;if(nums[mid]<nums[mid+1]){left=mid+1;}else{right=mid;}}mid=(right-left)/2+left;return mid;
}

left=mid+1,因为mid不可能是峰值。right=mid,因为此时mid可能是峰值。

二分查找的时间复杂度为O(logN),是一种高效的查找方式,在做相关题目,要注意找到单调性的规律,满足什么条件时单调性改变,产生极值,是解题的关键,找到单调性的规律后,就可以一次排查掉一半数据了,还有就是注意left<right开闭区间等情况即可。


http://www.ppmy.cn/news/21293.html

相关文章

字符串流stringstream--<sstream>

字符串流stringstream流详解 一.stringstream是C提供的一个字符串流&#xff0c;与iostream和fstream的操作方法类似&#xff0c;只是功能不同。要使用字符串流必须包含其头文件<sstream>。 #include<sstream> 二.stringstream字符串流通常用来做数据转换&#x…

Java多线程之CAS中的ABA问题与JUC的常见类

文章目录一. CAS指令与ABA问题1. 解析CAS2. 基于CAS实现的原子类3. 基于CAS实现自旋锁4. ABA问题二. JUC中的常见类1. Callable接口2. ReentrantLock类(可重入锁)3. Semaphore类(信号量)4. CountDownLatch同步工具类一. CAS指令与ABA问题 1. 解析CAS CAS即compare and awap, …

【整理五】

1.bind、call、apply 区别&#xff1f;如何实现一个bind&#xff1f; bind,call,apply三个方法都可以用来改变this的指向 call和apply调用后会立即执行,bind调用后不会立即执行而是返回一个改变this指向之后的一个函数call和bind的函数参数传递方式是(this绑定对象,参数1,参数…

【C++】入门(上)

本期博客给大家带来的全是干货&#xff0c;慢慢享用吧~C入门主要是一些对C语言不足的语法补充&#xff0c;废话不多说直接上干货&#xff1a;一、C的输出和输入1.1 输出在C上我们要想在屏幕&#xff08;控制台&#xff09;上进行一些内容的输出可以使用关键字&#xff1a;cout具…

MySQL中的多表联合查询

目录 一.介绍 数据准备 交叉连接查询 内连接查询 外连接 子查询 特点 子查询关键字 all关键字 any关键字和some关键字 in关键字 exists关键字 自关联查询 总结 一.介绍 多表查询就是同时查询两个或两个以上的表&#xff0c;因为有的时候用户在查看数据的时候,需要…

Linux搭建Hyperledger Fabric区块链框架 - Hyperledger Fabric 概念

企业选型的区块链底层技术 Hyperledger Fabric 概念 2015年&#xff0c;Linux基金会启动了Hyperledger项目&#xff0c;目标是发展跨行业的区块链技术。 Hyperledger Fabric是Hyperledger中的一个区块链项目&#xff0c;包含一个账本&#xff0c;使用智能合约并且是一个通过所…

R语言与数据分析—上(篇幅长,全)

内容过长但详细&#xff0c;分三篇写&#xff0c;总结分享也供日后参考回顾一、什么是R语言R是免费的&#xff0c;是一个全面的统计研究平台&#xff0c;提供了各式各样的数据分析技术&#xff0c;R拥有顶尖的绘图功能二、R语言优点和缺点优点1、有效的数据处理和保存机制2、拥…

【Vue】模板语法——文本插值

一、模板语法什么是模板语法Vue 使用一种基于 HTML 的模板语法&#xff0c;使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上。所有的 Vue 模板都是语法层面合法的 HTML&#xff0c;可以被符合规范的浏览器和 HTML 解析器解析。在底层机制中&#xff0c;Vue 会将模板编…