二分的模板(新手上路)
今天开始来复习算法基础课的内容了 今天是二分 二分有好几种类型 ,
先上板子(数列默认升序,如果没有升序可以用sort排一下);
如果快要比赛的话,就记住判断时,大于等于找小等 ,小于等于早大等;
仅仅针对本文章的板子
1 求升序序列的数组中小于等于某个数(target)的最小值
int str[100]; //假设已经排好序的给定数组;
int l = 0 , r = n - 1;
while(l < r)
{int mid = l +r >> 1; //这里是移位运算;二进制向右移动一位,相当于除以二;if(str[mid] >= target(要查找的那个数) )r = mid;else l = mid+1; 这里的 l = mid + 1 是为了区间的不重不漏原则;
}cout << str[l]<<endl;
return 0 ;
再上第二个板子
找出升序序列的大于等于某个数的最大值;
int str[100];
int l = 0 , r = n - 1;
while(l < r)
{int mid = (l + r +1) >> 1;//这里加上1是防止陷入死循环;if(str[mid] <= targe) l = mid;else r = mid - 1;
}cout << str[l] << endl;
注意 在例子中我并没有判断是否这个条件不成立的情况,如果要加上可以在最后的 cout 前加上一个判断语句即可 ,接下里我们来探讨。
本质核心内容以及核心思想其实只有几行代码,而这几行代码中对区间的判定可以决定搜索的条件,如
:找到给定数列中大于等于某个数的最小值,这时候(默认升序)你在二分的过程中需要对更新左边界与右边界的条件进行一个思考 , 反过来,如果我们要找到该序列中小于等于某个数的值,这时候同样要进行对边界条件的系修改 , 如下面这道题
这是在acwing上一道经典的题目;在这个题目中我们可以看到,这个其实就是对两个板子的应用;
下面就是ac代码
#include<iostream>
#include<cstdio>using namespace std ;
const int N = 100010;int a[N];int main()
{int n , q;cin >> n >>q;for(int i = 0 ; i < n ; i++)cin >> a[i];while(q--){int l = 0 , r = n-1;int o ;cin >>o ;while(l <r){int mid = l +r >>1;if( a[mid] >= o)r = mid;else l = mid+1;}int kk = l ;l = 0 , r= n-1;while( l < r){int mid = (l+r+1)/2;if(a[mid] <= o)l = mid;else r = mid-1;}if(a[kk] == o && a[r] ==o){cout << kk <<' '<< r <<endl;}else cout << "-1 -1"<<endl;}return 0 ;}
整来说 ,对初学者来说判断边界有时候会早不到头脑,便一直出错;其实其原理大家并不需要理解的太过于深刻,因为解决实际问题的时候我们需要的是写出来这个算法来解决问题,并不是要去写这个算法的证明,
另外 ,要注意一下二分的开始的 l 与r 的范围, 尽量接近已知符合要去的范围,范围越小运行的越快。
学习算法的小伙伴们咱们一起加油吧!
二分的模板(新手上路)相关推荐
- 【新手上路】语法入门算法入门题单
作者:王清楚 链接:[新手上路]语法入门&算法入门题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 来源:牛客网 介绍:本题单分为语法入门和算法 ...
- HanLP《自然语言处理入门》笔记--1.新手上路
文章目录 1. 新手上路 1.1 自然语言与编程语言的比较 1.2 自然语言处理的层次 1.3 自然语言处理的流派 1.4 机器学习 1.5 语料库 1.6 开源工具 1.7 总结 1.8 GitHu ...
- 自然语言处理之新手上路
1. 新手上路 自然语言处理(Natural Language Processing,NLP)是一门融合了计算机科学.人工智能及语言学的交叉学科,它们的关系如下图所示.这门学科研究的是如何通过机器学习 ...
- ALM新手上路(四)
新手上路一 1.1.快速入门 首先我们按照章节3安装说明中成功安装了我们的ALM之后,我们就可以根据我们的快速入门进行一个操作使用了. 1.1.1 ALM-H技术简介 ALM-H可以使 IT 人员能够 ...
- VS2010 C# ReportViewer控件新手上路心得
环境:Visual Studio 2010, C#; 前言:本来是用VS2010连接Oracle数据库做一个报表功能,数据集设置部分出了些问题还未解决,因此先用本地动态数据为测试用例先熟悉VS自带的R ...
- day3 ECS云服务器新手上路
day3 ECS云服务器新手上路 创建资源 请点击页面左侧的 云产品资源,在下拉栏中,查看本次实验资源信息: 在资源下拉栏点击 免费开通 按钮,开始创建实验资源. ECS远程登录实践 登录 方法参见: ...
- Windows内核新手上路1——挂钩SSDT
Windows内核新手上路1--挂钩SSDT 这个系列记录学习我学习windows内核的点点滴滴,高手请直接无视. 文章核心内容:挂钩SSDT中函数列NtOpenProcess,NtDuplicate ...
- Windows内核新手上路3——挂钩KeUserModeCallBack
Windows内核新手上路3--挂钩KeUserModeCallBack 1. 简介 在Windows系统中,提供了几种方式从R0调用位于R3的函数,其中一种方式是KeUserModeCall ...
- Windows内核新手上路2——挂钩shadow SSDT
Windows内核新手上路2--挂钩shadow SSDT 文章核心内容:安全软件窗口保护.安全输入.截屏保护的一些思路.挂钩NtUserFindWindowEx.NtUserGetForegroun ...
- Linux新手上路命令
Linux新手上路命令 命令:www.ahlinux.com Ctrl+Alt+F1 进入命令界面 Ctrl+Alt+F7 返回图形界面 root用户和普通用户切换 administrator 2 ...
最新文章
- hdu1521 排列组合
- 高通平台耳机插拔检测
- java通过反射获取类名、属性名称以及@Table注解上的表名称
- Build 2016,你可能忽视的几个细节
- JavaScript 读写 span标签的值 - 代码篇
- Python学习笔记:序列之字符串
- 苹果耳罩式耳机曝光 将于今年下半年发布
- Spark2.0.2+Zeppelin0.6.2 环境搭建 初探
- mysql账户最小授权_mysql 创建帐号并授权
- AVR单片机项目教程 基于C语言,AVR单片机项目教程:基于C语言(第2版)
- 博弈论(巴什博弈,威佐夫博弈,尼姆博弈)
- MOSFET原理与应用
- InputStream读JSON数据时乱码
- 转载:stm32的引脚有两种用途
- vue动画transition
- 阿木有专门讲MAVROS功能包节点的课,有讲MAVROS怎么订阅消息,发布消息。看来MAVROS这边的编程不用太担心。
- 英文期刊投稿指南模板(通用版)-----以IEEE Wireless Communications为例
- 强大的矩阵奇异值分解(SVD)及其应用(转)-我们老师推荐的
- godspeed机器人_来自深渊第二季剧情
- 如何提高自己的想象力和思考力?