【蓝桥杯知识点】二分查找(超超超详细,再也不会错啦)

        考完了计算机三级,蓝桥杯和数学建模的学习也要恢复常态啦!今天,我们来了解一种相对简单但容易出错的算法——二分查找。这里还有一些小方法让二分查找没有那么容易出错,开始学习吧啦啦啦!

PS: 文章主要参考:b站 一只会code的小金鱼 的视频(真的讲得超级超级详细!!!很适合大一没接触过算法的小白学习,而且up的声音也很好听很好听!!!墙裂推荐!)

 基本思路

 

如上图:

查找的对象是一个已经排列好顺序的数的序列,这里要想像一个不存在的红蓝边界,要找的那个数就是红蓝边界,为了找到那个数,先找头尾l和r(-1,n),再找一个中间值,即m=\frac{l+r}{2},如果m属于蓝色,那么头就变成m,如果属于红色尾就变成m,依次查找直到头+1=尾

  l                            I                                                     r   

初始:l指向蓝色区域,r指向红色区域

循环:l,r快速向红蓝边界靠近,保持lr颜色不变

时间复杂度:O(log n) 

注意:l初始位置为-1,r的初始位置为N,防止出现如下情况:

             5         5            8             9                      

在上面的数组中查找<=4的数出现的位置,如果l初始=0,就会出现错误

一定要让l初始在蓝,r初始在红!

      I        5         5           8              9                           

l初始位置为-1,r的初始位置为N,则黄色即为边界,程序马上退出循环体

核心就是这段伪代码啦:

注意:Isblue中,blue的判断条件 是blue的条件,如<5(下图例1)

 这些查找都可以用c++中 的库函数,但二分题型很多,还是掌握根本比较好

解题步骤

精析一组题

例:

数组:     3      4      4      5      5       5         6         7     

分析红蓝条件,找到边界,找到第一个>5的元素的下标

数组:     3      4      4      5      5       5     I     6         7     

下标:     1      2      3      4      5       6           7         8

   主体:

int l=0,r=9;
while(l+1!=r)
{
   int mid (l+r)/2;
   if(isblue(q[mid]))
    {
       l=mid;
    }
   else r=mid;
   if(arr[l]==5)
   {
    return r;
   }
}

isblue:

bool isblue(int x)
{
    if(x<=5)
     return true;
    else 
     return false
}

 题目变形:

数组:     3      4      4      5      5       5         6        7     

分析红蓝条件,找到边界,找到第一个<=5的元素的下标

数组:     3      4      4      5      5       5     I     6         7     

下标:     0      1      2      3      4       5           6         7       //注意下标变成1了

int l=-1,r=8;
while(l+1!=r)
{
   int mid (l+r)/2;
   if(isblue(q[mid]))
    {
       l=mid;
    }
   else r=mid;
   if(arr[l]==5)
   {
    return l;
   }
}
bool isblue(int x)
{
    if(x<=5)
     return true;
    else 
     return false
}

例题 数的范围

题目:

 

答案:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=100010;

int n,q;
int arr[N];

//数组中的数是num,被询问数是x 
bool isBlue1(int num,int x)
{
	if(num<x) return true;
	else return false;
}

//第一个二分查找的是 被询问数第一次出现的位置(下标) 
bool isBlue2(int num,int x)
{
	if(num<=x) return true;
	else return false;
}

//第二个二分查找的是 被询问数最后一次出现的位置(下标)  
int binary_search1(int q[],int len,int x)
{
	int l=-1,r=len;
	while(l+1<r)
	{
		int mid=(l+r)/2;
		if(isBlue1(q[mid],x))
		{
			l=mid;
		}
		else r=mid;
	}
	if(arr[r]==x) return r;
	else return -1;
}

int binary_search2(int q[],int len,int x)
{
	int l=-1,r=len;
	while(l+1<r)
	{
		int mid=(l+r)/2;
		if(isBlue2(q[mid],x))
		{
			l=mid;
		}
		else r=mid;
	}
	if(arr[r]==x) return l;
	else return -1;
}



int main()
{
	scanf("%d %d",&n,&q);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&q[i]);
	}
	
	while(q--)
	{
		int x;
		scanf("%d",&x);
		int res1=binary_search1(arr,n,x);//查找数起始下标 
		//优化:
	    if(res1==-1)
	    {
		  printf("-1 -1\n");
		  continue;
	    } 
		int res2=binary_search2(arr,n,x);//查找数终止下标 
	}

	printf("%d %d\n",res1,res2);
	return 0;
 } 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式学习笔记 - 设计模式与范式 - 创建型:7.原型模式:如何快速地clone一个HashMap散列表

原型模式的原理与应用 如果对象的创建成本比较大&#xff0c;而同一个类的不同对象之间差别不大&#xff08;大部分字段都相同&#xff09;&#xff0c;在这种情况下&#xff0c;我们可以利用对已有对象&#xff08;原型&#xff09;进行复制&#xff08;或者叫拷贝&#xff0…

Lunule: An Agile and Judicious Metadata Load Balancer for CephFS——论文阅读

SC 2021 Paper 分布式元数据论文阅读笔记 问题 CephFS采用动态子树分区方法&#xff0c;将分层命名空间划分并将子树分布到多个元数据服务器上。然而&#xff0c;这种方法存在严重的不平衡问题&#xff0c;由于其不准确的不平衡预测、对工作负载特性的忽视以及不必要/无效的迁…

解码新时代内存架构:探秘数据在内存中的灵动驻足

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 随着信息技术的飞速发展&#xff0c;我们身处一个数据爆炸的时代。数据的处理和存储方式正日益成为技术革新的重要领域。在新时代的…

【Java】高级篇2:多线程

一、相关概念 注意&#xff1a; 1、不同进程之间不共享内存 2、进程之间的数据交换和通信成本很高 线程调度&#xff1a; 单核CPU与多核CPU&#xff1a; 并行与并发&#xff1a; 二、创建和启动线程 1、概述 2、方式 2.1 方式一&#xff1a;继承Thread类 2.2 方式二&#xf…

Fantasy RPG Spell Pack 2

介绍奇幻角色扮演游戏魔法包VFX,这是为您的Unity奇幻角色扮演游戏提供的终极视觉效果解决方案!这个包包含30个独特的VFX,将为您的法术和能力带来生命,让您的玩家沉浸在魔法和奇迹的世界中。 从令人惊叹的彩虹盾和闪电到旋转门户和召唤圈,这个包有你需要的一切来创造一个真…

GETSHELL方法总结上

渗透的总步骤 1.信息收集找到弱漏洞 2.漏洞挖掘 漏洞验证 3.有一定权限 getshell 4.提权后---渗透 5.内网渗透】 前后台拿shell方法汇总 接下来我们实操一波dedecms也就是织梦cms 如果你们的靶场是空白的 可能是php版本 我们修改为5.2 可能是源码问题 我们不要急着上传…

ChatGPT论文指南|揭秘8大ChatGPT提示词研究技巧提升写作效率【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; ChatGPT论文指南|揭秘8大ChatGPT提示词研究技巧提升写作效率【建议收藏】 目录 1.写作方法 2.方法设计 3.研究结果 4.讨论写作 5.总结结论 6.书…

MySQL--select count(*)、count(1)、count(列名) 的区别你知道吗?

MySQL select count(*)、count(1)、count(列名) 的区别&#xff1f; 这里我们先给出正确结论&#xff1a; count(*)&#xff0c;包含了所有的列&#xff0c;会计算所有的行数&#xff0c;在统计结果时候&#xff0c;不会忽略列值为空的情况。count(1)&#xff0c;忽略所有的列…

Axure RP 9 for mac中文版密钥激活版下载

Axure RP 9是一款专业的快速原型设计工具&#xff0c;它可以帮助产品设计师、交互设计师和用户体验设计师等创建高保真度、交互性强的原型&#xff0c;以便在产品开发之前进行测试和用户验证。 软件下载&#xff1a;Axure RP 9 for mac中文版密钥激活版下载 该工具具有丰富的功…

2023蓝桥杯C/C++A组省赛 B题: 有奖问答|DFS搜索 、线性dp

题目链接&#xff1a; 1.有奖问答 - 蓝桥云课 (lanqiao.cn) 说明&#xff1a; DFS做法&#xff1a; 因为是填空题&#xff0c;不用考虑超时&#xff0c;首先先考虑暴力做法DFS来做&#xff0c;根据题意&#xff0c;30道题&#xff0c;有一个答题的先后顺序&#xff0c;上一…

【算法篇】逐步理解动态规划1(斐波那契数列模型)

目录 斐波那契数列模型 1. 第N个泰波那契数 2.使用最小花费爬楼梯 3.解码方法 学过算法的应该知道&#xff0c;动态规划一直都是一个非常难的模块&#xff0c;无论是状态转移方程的定义还是dp表的填表&#xff0c;都非常难找到思路。在这个算法的支线专题中我会结合很多力…

Java学习笔记 | Java基础语法 | 03 | 流程控制语句

文章目录 0 前言1.流程控制语句1.1 流程控制语句分类1.2 顺序结构 2.判断语句2.1 if语句1. if语句格式1练习1&#xff1a;老丈人选女婿练习2&#xff1a;考试奖励 2. if语句格式2练习1&#xff1a;吃饭练习2&#xff1a;影院选座 3. if语句格式3练习1&#xff1a;考试奖励 2.2 …

Vue使用font-face自定义字体详解

目录 1 介绍2 使用2.1 语法2.2 属性说明2.3 Vue使用案例2.3.1 全局定义字体2.3.2 在页面使用 3 注意事项 1 介绍 font-face 是 CSS 中的一个规则&#xff0c;它允许你加载服务器上的字体文件&#xff08;远程或者本地&#xff09;&#xff0c;并在网页中使用这些字体。这样&am…

使用 STL 容器发生异常的常见原因分析与总结

目录 1、概述 2、使用STL列表中的元素越界 3、遍历STL列表删除元素时对迭代器自加处理有问题引发越界 4、更隐蔽的遍历STL列表删除元素时引发越界的场景 5、多线程同时操作STL列表时没有加锁导致冲突 6、对包含STL列表对象的结构体进行memset操作导致STL列表对象内存出异…

大学教材《C语言程序设计》(浙大版)课后习题解析 | 第一、二章

概述 本文主要提供《C语言程序设计》(浙大版) 第一、二章课后习题解析&#xff0c;以方便同学们完成题目后作为参考对照。后续将写出三、四章节课后习题解析&#xff0c;如想了解更多&#xff0c;请持续关注该专栏。 专栏直达链接&#xff1a;《C语言程序设计》(浙大版)_孟俊宇…

Hive SQL必刷练习题:复购率问题(*****)

是说这个数据表中&#xff0c;找到最后一天 &#xff0c;也就是今天的日期&#xff0c;max(date) over()S today 【借助开窗函数】 截至最后一天位置&#xff0c;也就是“今天“&#xff0c;表中的最新的一天 去看90天内“某商品复购率 近90天内购买它至少两次的人数 购买它…

c++常考基础知识(2)

二.c关键字 关键字汇总 c中共有63个关键字&#xff0c;其中包括int&#xff0c;char&#xff0c;double等类型关键字&#xff0c;if&#xff0c;else&#xff0c;while&#xff0c;do&#xff0c;等语法关键字&#xff0c;还有sizeof等函数关键字。 三.数据结构 1.数组&#x…

常见的OOM 问题的 6 种场景

今天跟大家一起聊聊线上服务出现 OOM 问题的 6 种场景,希望对你会有所帮助。 一、堆内存 OOM 堆内存 OOM 是最常见的 OOM 了。 出现堆内存 OOM 问题的异常信息如下: java.lang.OutOfMemoryError: Java heap space此 OOM 是由于 JVM 中 heap 的最大值,已经不能满足需求了…

Git的原理和使用(四)

目录 远程操作 理解分布式版本控制系统 远程仓库 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置Git 忽略特殊文件 为命令配置别名 标签管理 理解标签 创建标签 操作标签 远程操作 理解分布式版本控制系统 1、每个人的电脑上都是一个完整的版本库…

批量重命名文件名,批量管理文件,复制后轻松删除原文件

在现代工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;无论是工作文档、图片还是视频资料。对于很多人来说&#xff0c;文件管理是一项繁琐且耗时的任务。不过&#xff0c;现在有一种高效的文件管理方法&#xff0c;可以帮助你轻松复制文件后删除原文件夹&#xff0…