首页 > 其他分享 >关于整数二分的详解

关于整数二分的详解

时间:2022-12-17 14:00:15浏览次数:46  
标签:二分 return 边界 int mid 整数 查找 while 详解

//查找左边界 SearchLeft 简写SL
int SL(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid; 
        else l = mid + 1; 
    }   
    return l;
}
//查找右边界 SearchRight 简写SR 
int SR(int l, int r) 
{
    while (l < r)
    {                   
        int mid = l + r + 1 >> 1; //需要+1 防止死循环
        if (check(mid)) l = mid;
        else r = mid - 1; 
    }
    return r; 
}

关于记忆:有减必有加

左边界:边界最左边的数,右边界同理.

一般二分应用于无非下面这四种情况:
1:找大于等于数的第一个位置 (满足某个条件的第一个数)
2:找小于等于数的最后一个数 (满足某个条件的最后一个数)
3.查找最大值 (满足该边界的右边界)、
4.查找最小值 (满足该边界的左边界)

然后每次使用这这两个模板的时候,先想是找这个区间的左端点还是还是右端点,然后选择用模板,最后再去写判断条件。如果你是新手,模板题做完,可以去找几道同类型算法题练练巩固下,我新手的时候就是没这样做555
推荐习题: 四平方和 分巧克力 机器人跳跃问题
下面这俩道是洛谷, 应用的3 和4 查找最值
https://www.acwing.com/blog/content/21312/
https://www.acwing.com/solution/content/118815/
下面是这道题的代码

#include <algorithm>
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int q[N];

int SL(int l, int r, int x) {
  while (l < r) {
    int mid = l + r >> 1;
    if (q[mid] >= x) r = mid;
    else l = mid + 1 ;
  }
  return l;
}

int SR (int l, int r, int x) {
  while (l < r) {
    int mid = l + r + 1 >> 1;
    if(q[mid] <= x) l = mid;
    else r = mid - 1;
  }
  return r;
}

int main() { int n,m;
    scanf ("%d%d",&n,&m);
    for(int i=0;i<n;++i) scanf ("%d",&q[i]);
    while ( m-- ) {
        int x;
        scanf ("%d",&x);
        int l = SL(0, n - 1, x);//查找左边界 并返回下标l
        if (q[l]!=x) cout <<"-1 -1"<<endl;//如果找不到  返回-1 -1
        else {
            cout << l << ' '; //如果找到了  输出左下标
            cout << SR(0, n - 1, x) << endl; //输出右下标
        }
    }
    return 0;
}

 

标签:二分,return,边界,int,mid,整数,查找,while,详解
From: https://www.cnblogs.com/NGDBZ/p/16988919.html

相关文章

  • 【HTML基础篇002】HTML之form表单超详解
    ......
  • YoloV7 标签匹配机 loss 计算详解
    这是一篇v7后处理详解的文章本篇文章主要对YoloV7的后处理进行详细讲解,YoloV7除了结构上,对前后处理都进行了改进,其余包括scheduler、optimizer等与YoloV6都是保......
  • JDBC_API详解
    DiverManager(驱动管理类)作用:①注册驱动②获取数据库链接Connection(数据库连接对象)作用:①获取执行sql的对象②管理事务获取SQL对象事务管理......
  • 13-flask博客项目之restful api详解2-使用
      13-flask博客项目之restfulapi详解1-概念 13-flask博客项目之restfulapi详解1-概念 ......
  • 13-flask博客项目之restful api详解
     一传统的开发模式前后端分类概念前端只需要独立编写客户端代码,后端也只需要独立编写服务端代码提供数据接口即可前端通过AJAX请求来访问后端的数据接口,将Model展示到......
  • 【数据挖掘&机器学习】招聘网站的职位招聘数据的分位数图、分位数-分位数图以及散点图
    一.本次需求背景本文主题:招聘网站的职位招聘数据的分位数图、分位数-分位数图以及散点图、使用线性回归算法拟合散点图处理详解之前的文章我们已经对爬取的数据做了清洗处......
  • SQL】sql语句LEFT JOIN(拼接表)详解
    1、语法SELECTcolumn_name(s)FROMtable1LEFTJOINtable2ONtable1.column_name=table2.column_name;2、说明按照一定规则,将表table1和表table12拼接起来。下面以......
  • gateway资源详解
    学习目标什么是gateway在Kubernetes环境中,KubernetesIngress用于配置需要在集群外部公开的服务。但是在Istio服务网格中,更好的方法是使用新的配置模型,即IstioGateway。Gat......
  • VirtualService资源详解
    **VirtualService资源详解学习目标什么是virtualService​​VirtualService​​中文名称虚拟服务,是istio中一个重要的资源,它定义了一系列针对指定服务的流量路由规则。每个......
  • ServiceEntry详解
     欢迎关注我的公众号: 目前刚开始写一个月,一共写了18篇原创文章,文章目录如下:​​istio多集群探秘,部署了50次多集群后我得出的结论​​​​istio多集群链路追踪,附实操视频​......