二分查找(整数二分)
二分查找
二分查找顾名思义就是折半查找,二分算法中最难处理的就是边界问题。int l=0,r=n-1;
边界一般有两种取法:向下取整mid=(l+r)/2和向上取整mid=(l+r+1)/2;
两种边界取法核心代码板子如下:
//1,向下取整
int one(int l,int r)
{while(l<r){int mid=(l+r)/2;if(chack(mid)==true)r=mid;else l=mid+1;}return l;
}
//2.向上取整
int tow(int l,int r)
{while(l,r){int mid=(l+r+1)/2;if(check(mid)==true)l=mid;else r=mid-1;}return l;
}
当向下取整mid=(l+r)/2时check(mid)是否满足条件,如果满足条件则说明要查找的答案就在区间[l,mid]区间内,更新 r=mid ; 如果不满足条件则说明答案在区间[mid+1,r]内,更新l=mid+1。
当向上取整mid=(l+r+1)/2时check(mid)是否满足条件,如果满足条件则说明要查找的答案就在区间[mid,r]区间内,更新 l=mid;如果不满足条件则说明答案在区间[l,mid-1]内,更新 r=mid-1。
举个栗子:有序上升数组a[0]~a[7]分别为2 3 4 5 6 7 8 9
我们需要从中查找出x=5第一次出现的位置,即a[3];我们需要判断a[i]<=x;
1.当mid=(l+r)/2时
此时a[mid]=5,满足条件,我们就要更新r=mid
2.当mid=(l+r+1)/2时
此时a[mid]=6,不满足条件,我们就要更新r=mid-1。
下面放一个经典二分查找题目
输入
测试数据的第一行输入n,m表示数组的长度和询问的次数(1<=n,m<=105)
接下来一行是 n 个数字A0 . . . An-1 满足 Ai<=Ai+1 (1<=Ai<=109)
然后输入m行,每行是一个数字Qi表示询问(1<=Qi<=109)
输出
对于每个询问,如果Qi在数组中出现过,输出两个数字分别第一次出现和最后一次出现的位置,如果Qi在数组中没有出现,则输出“-1 -1”
例子
输入
10 3
3 3 3 5 5 5 6 7 7 7
5
6
10
输出
3 5
6 6
-1 -1
代码如下
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int a[N];int main()
{scanf("%d%d",&n,&m);for(int i=0;i<n;i++)scanf("%d",&a[i]);while(m--){int x;scanf("%d",&x);int l=0,r=n-1;while(l<r){int mid=l+r>>1;//mid=(l+r)/2;if(a[mid]>=x)r=mid;else l=mid+1;}if(a[l]!=x)cout<<"-1 -1"<<endl;else{cout<<l<<" ";//输出左边界int l=0,r=n-1;//下面查找右边界while(l<r){int mid=l+r+1>>1;//mid=(l+r+1)/2;if(a[mid]<=x)l=mid;else r=mid-1;}cout<<l<<endl;}}
}
以上就是二分查找中的整数二分查找内容,相信大家对二分已经有了更深的理解了吧,实践是检验真理的唯一标准,刷题巩固吧!!!
哪里写的有问题的话还请各位大佬不吝赐教orn。
二分查找(整数二分)相关推荐
- 第十九章:二分查找和二分答案
二分查找 二分的思想在程序设计中有着广泛的应用,例如,排序算法中的快速排序.归并排序,数据结构中的二叉树.堆.线段树等.二分是一种常用且高效的算法,它的基本用途是在单调序列中进行查找和判定操作. 二分 ...
- python 二分查找_二分查找算法总结
二分查找的思想是通过每次折半快速找到一个数,例如,我们经常玩的游戏猜数字,在0~1000,随便出一个数字98让对方猜,首先猜500,对方给提示比500大还是小,如果数字小于500,就继续猜250,依次 ...
- 软件测试二分查找函数,二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.[1] 中文名 二分查找 外文名 Binar ...
- Python数据结构与算法篇(五)-- 二分查找与二分答案
1 二分法介绍 1.1 定义 二分查找又称折半查找.二分搜索.折半搜索等,是一种在静态查找表中查找特定元素的算法. 所谓静态查找表,即只能对表内的元素做查找和读取操作,不允许插入或删除元素. 使用二分 ...
- 二分查找和二分答案(洛谷)
细节好可怕~ 二分查找算法的细节剖析_JackComeOn的博客-CSDN博客原文:https://www.cnblogs.com/kyoner/p/11080078.html我周围的人几乎都认为二分 ...
- 二分查找和二分搜索树(含插入,查找的递归非递归)
有序顺序表顺序搜索判定树: 扩充二叉树(用于分析的判定树): 其中第i个内部节点刚好处于第i-1个外部节点和i+1个内部节点之间 #include<iostream> #include&l ...
- python递归实现二分查找_python二分查找算法的递归实现
本文实例讲述了python二分查找算法的递归实现方法.分享给大家供大家参考,具体如下: 这里先提供一段二分查找的代码: def binarySearch(alist, item): first = 0 ...
- python递归实现二分查找_python二分查找算法的递归实现方法
本文实例讲述了python二分查找算法的递归实现方法.分享给大家供大家参考,具体如下: 这里先提供一段二分查找的代码: def binarySearch(alist, item): first = 0 ...
- 查找算法:二分查找、顺序查找
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...
- 顺序查找与二分查找算法
顺序查找算法 顺序查找是非常简单常用的查找算法,基本思路:从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1.该算 ...
最新文章
- 「欧拉定理」学习笔记(费马小定理)
- 李开复对话彭特兰:AI不是单打独斗,应避免AI冷战
- xhprof安装使用【转】
- zip unzip 命令
- ABAP Development Tool 代码模板和其他一些实用技巧汇总
- 基于visual Studio2013解决C语言竞赛题之1049抓牌排序
- jq写的项目如何部署到静态服务器_如何在阿里云服务器上部署一个Web项目
- oracle多少钱一套_消防水炮多少钱一套?您真的只需要一套吗
- 使用Google zxing生成二维码
- cognos java_cognos开发心得
- python怎么启动编程_启动Python编程有哪些方法?
- CAD绘图设计效率慢?这些外挂神器帮你1小时完成3小时的工作!
- C#计算MD5结果不一致
- liunx系统文件中转站(ftp服务)项目
- 天龙八部科举答题问题和答案(全1/8)
- 极课大数据完成C轮融资,投资方为好未来
- 读《因果的真相》第八、九章摘抄笔记
- 计算机总是提醒更新,电脑关机的时候总是提示系统正在更新怎么办?
- 参考文献名称怎么复制_[Zotero+Word]Zotero+Word2016参考文献中英文混排,解决et al和等的问题...
- 71 ----二次曲面方程:椭球面、双曲面、抛物面、二次曲面的种类
热门文章
- linux ip route 命令详细解释
- python中算术位移运算
- 计算机二级关系代数运算知识点,计算机二级:关系代数运算.doc
- 除了ARM架构,还有其他的架构吗?有没有可能开发出比ARM架构还好的? RISC-V是未来的趋势吗?
- BUUCTF-WarmUp
- centos mysql 安装教程_CentOS中安装MySQL步骤详解
- JavaScript的原型和继承
- 国产六大CPU厂商,近两年进展如何?
- MFC中CreateCompatibleDC的作用
- Uncaught ReferenceError: xxx is not defined 解决办法