首页 > 其他分享 >二分基础

二分基础

时间:2023-02-02 19:44:29浏览次数:45  
标签:二分 基础 mid bound leq while ans

二分

(类似于单调函数求零点)

二分查找

  • 在一个单调有序的集合中查找元素,每次将集合分为左右两部分,判断解在哪个部分中并调整集合上下界重复直到找到目标元素
    题目:
    给定一串n个单调递增的数,有q次询问>=x且<=y的数有多少个
    数据规模:1$ \leq n \leq10^5$ 1$\leq q \leq 50000 $

手动实现
写法一
(注意下取整,避免死循环)

//找>=x的第一个位置 
while(l < r){
	mid = (l + r) / 2;
	if(a[mid] >= x) r = mid;
	else l = mid + 1;
}

//答案是r
//找<=x的第一个位置 
while (l < r) {
	mid = (l + r + 1) / 2;	//因为是下取整,所以要+1,避免出现l=l的情况 eg:3 3 3出现死循环
	if(a[mid] <= x) l = mid;
	else r = mid - 1;
}

写法二
(永远把\(mid\)丢掉,但是要用\(ans=min(ans, mid)\)记录答案);

//找>=x的第一个位置
while (l <= r) {
	mid = (l + r) / 2;
	if(a[mid] >= x) r = mid - 1;	//ans是最后一次a[mid]>=x成立的mid,所以ans=r+1也就是l
	else l = mid + 1;
}

//答案就是 r+1 或者 l
//找<=x的第一个位置
while (l <= r) {
	mid = (l + r) / 2;
	if(a[mid] <= x) l = mid + 1;	//ans是最后一次a[mid]<=x成立的mid,所以ans=l-1
	else r = mid - 1;
}

Ending Edition

//找>=x的第一个位置
while(l <= r) {
	mid = (l + r) / 2;
	if(a[mid] >= x){
		r = mid - 1;
		ans = min(ans, mid);
	}else{
		l = mid + 1;
	}
}
//找<=x的第一个位置
while(l <= r) {
	mid = (l + r) / 2;
	if(a[mid] <= x){
		l = mid + 1;
		ans = min(ans, mid);
	}else{
		r = mid - 1;
	}
}

C++STL的二分查找函数

  • binary_search 返回bool值,是否存在
  • lower_bound已排好序的序列a中利用二分搜索找出指向满足\(a_i \geq k\)的\(a_i\)的最小的指针
  • upper_bound已排好序的序列a中利用二分搜索找出指向满足\(a_i > k\)的\(a_i\)的最小的指针
    如果想要知道下标减去a即可
    Eg:lower_bound(a, a + 11, 55);

标签:二分,基础,mid,bound,leq,while,ans
From: https://www.cnblogs.com/csai-H/p/17087220.html

相关文章

  • 前端算法之二分查找
    在数组中查找指定元素,如果存在就返回它的位置,如果不存在,就返回-1。这是一道非常经典的算法题,考的就是二分查找算法,首先分析二分查找的思路:假设一个数组为[3,5,19,22,......
  • 2023牛客寒假算法基础集训营4 A-H+JLM
    比赛链接A题解知识点:数学。算一下发现\(3\)最好,\(2,4\)并列,\(4\)以后递减。于是,特判\(3\),其他取最小值。(众所周知,\(e\)进制最好qwq。时间复杂度\(O(1)\)......
  • MySQL基础
    vsMySQL数据库1.数据库相关概念数据库:存储数据的仓库,数据是有组织的进行存储,英文:DataBase,进程DB存储和管理数据的仓库其本质是一个文件系统,还是以文件的方式将......
  • 零基础学前端之CSS选择器的权重
    在前面,我们学习了样式表引入的优先级判断。如果多个选择器都来修饰同一个元素,优先级又该如何判断呢?我们来看一个例子。<!DOCTYPEhtml><htmllang="en"><head><metachars......
  • 二分查找-力扣(Java)
    题目描述给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。来源:力扣(LeetCode)链接......
  • Linux基础课:第四章--ssh
    第四章的学习ssh配置ssh免密登录首先在.ssh/.config创建文件,初始化server信息。然后利用公钥或者命令ssh-copy-id登录scp两个终端之间传递文件scp[-r]sourcedest......
  • shell 编程基础
    变量类型Shell中按照变量的作用域和生命周期,Shell变量可分为四大类:(1)永久环境变量:需要修改配置文件,变量永久生效。(2)临时环境变量:使用export命令行声明即可,变量在Shell脚......
  • Java基础学习10--算法
     队列(2023-02-02)使用数组模拟队列(未优化)1.需要用的变量有front=-1,rear=-1,maxsize以及数组int[]arr;2.判断队列已满的条件是rear==maxsize-1,队列为空的条件是rear==fro......
  • vim基础用法
    如何退出Esc+:q(或者:wq,如果你改了东西要保存的话;:!q不保存,强制退出)讲个笑话:我用vim三年了,因为我到现在都不知道怎么退出!删除所有内容Esc+ggdG跳转到指定行E......
  • 2、Python基础(函数)
    #格式化代码快捷键Ctrl+Alt+L#函数的定义​deff1():print("你好")​​#函数的调用f1()​​#函数的参数#使用函数计算1+2的值​d......