【3.整数与浮点数二分】

简介: 1.整数二分>### 二分本质>- 有单调性,一定可以二分>- 二分的题目,不一定非要有单调性>### 思路:分俩种情况,有俩种模板

1.整数二分

二分本质

  • 有单调性,一定可以二分
  • 二分的题目,不一定非要有单调性

思路:分俩种情况,有俩种模板

1661149299357.png

1661149312078.png

具体考虑用哪一个模板:

  • 碰到二分题,写完mid 之后,先写check函数
  • 根据check(mid)想一下,true 和false该怎么更新区间
  • 如果更新区间是 l = mid ,r = mid + 1 ,此时使用mid = (l + r + 1) / 2
  • 如果更新区间是 r = mid, l = mid + 1, 此时使用mid = (l + r) / 2

如果在第一种情况下,l = r - 1,因为是除法是向下取整,所以mid = l ,此时更新区间还是[ l , r]死循环。

题目

给定一个按照升序排列的长度为 n 的整数数组,以及 q个查询。

对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。

如果数组中不存在该元素,则返回 -1 -1
<br/>
输入格式
第一行包含整数 n 和 q,表示数组长度和询问个数。

第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。

接下来 q 行,每行包含一个整数 k,表示一个询问元素。
<br/>
输出格式
共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。

如果数组中不存在该元素,则返回 -1 -1。
<br/>
数据范围
1 ≤ n ≤ 100000
1 ≤ q ≤ 10000
1 ≤ k ≤ 10000
<br/>
输入样例:

6 3
1 2 2 3 3 4
3
4
5

输出样例

3 4
5 5
-1 -1

代码

# include <iostream>
const int N = 1e6 + 10;
using namespace std;
int n, m;
int q[N];

int main()
{
    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 = 0, r = n - 1;
       
        while(l < r)
        {
           int mid = (l + r) >> 1;
           if (q[mid] >= x) r = mid;
           else l = mid + 1;
         
        }
        if (q[l] != x) cout << "-1 -1"<< endl;
        else 
       {
           cout << l << " ";
           int l = 0, r = n - 1;
           while (l < r)
           {
               int mid = (l + r + 1) >> 1;
               if (q[mid] <= x) l = mid;
               else r = mid - 1;
           }
           cout << l << endl;
       }
   }
   return 0;
}

2.浮点数二分

  • 浮点数二分,每次都会严格缩小一半,不用处理边界问题
  • 而整数二分,因为有整数的存在,所以缩小不一定是一半,需要处理边界问题

思路:

  • 与整数二分一样,只不过当r - l <= 1e6(非常小的数),此时就不需要进行二分了

代码

求根号X的值


#include <iostream>
using namespace std;

int main()
{
    double x;
    cin >> x;
    
    double l = 0, r = x;
    while (r- l > 1e-8)
    {
        double mid = (l + r) / 2;
        
        if (mid * mid >= x) r = mid;
        else l = mid;
    }
    printf("%lf", l);
    return 0;
}

3.附加模板

整数二分

bool check(double x){/* */}       //检查x是否满足某种性质
//区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用;
int bsearch_1(int l, int r)
{
   while (l < r)
   {
       int mid = l + r >> 1;
       if(check(mid)) r = mid;  //check()判断mid是否满足性质
       else l = mid + 1;
   }
   return l;
}



//区间[l, r]被划分成[l, mid - 1]和[mid , r]时使用;
int bsearch_2(int l, int r)
{
   while (l < r)
   {
       int mid = l + r + 1 >> 1;
       if(check(mid)) l = mid;  //check()判断mid是否满足性质
       else r = mid - 1;
   }
   return l;
}

浮点数模板

bool check(double x){/* */}       //检查x是否满足某种性质
double bsearch_3(double l, double r)
{
   while (l < r)
   {
       double mid = l + r >> 1;
       if(check(mid)) l = mid;  //check()判断mid是否满足性质
       else r = mid ;
   }
   return l;
}
目录
相关文章
|
9月前
|
搜索推荐 算法 数据挖掘
用小红书电商 API 实现小红书店铺商品用户画像精准构建
在社交电商时代,小红书凭借海量用户与商品数据,助力店铺构建精准用户画像,实现个性化推荐与高效运营。本文详解如何通过小红书电商 API 获取用户行为、交易与属性数据,结合算法模型完成数据清洗、特征提取与用户聚类,提升转化率与用户粘性。内容涵盖 API 调用示例、特征工程、模型构建及实施建议,帮助开发者系统化落地用户画像方案,驱动业务增长。
529 0
|
10月前
|
人工智能 安全 搜索推荐
合规风险、汇率损失、用户流失:跨境结算的“三座大山”怎么搬?
跨境电商代购系统面临跨境支付效率低、成本高、合规难和技术滞后等痛点。本文分析四大挑战,并探讨数字钱包、区块链、API与AI等技术解决方案,结合典型案例与未来趋势,助力企业构建高效、低成本、合规的跨境支付体系,推动行业迈向智能化、绿色化发展新阶段。
|
5月前
|
人工智能 JSON API
从MCP到PTC Anthropic回归Code Execution路线,AiPy的范式被再次验证
Anthropic从MCP到Programmatic Tool Calling的演进,实则是对“上下文爆炸”问题的修正,仍属“上下文工程”范畴。而AiPy早于Claude Code提出Python-use范式,主张“Code is Agent”,通过代码直接交互环境,实现“万物互联、万物编程”。相较MCP/PTC依赖预定义工具,Python-use更具扩展性与灵活性,兼容API、包调用及本地执行,早在2024年8月即实现命令级代码执行,领先Skills两月。CodeAct理念与其高度一致,但本质仍是工具注册模式。Python-use范式直击Agent核心:大模型与环境数据的无限连接能力
|
9月前
|
安全 IDE 开发工具
电脑错误代码0xc0000001解决步骤
以下是解决电脑错误代码0xc0000001的详细步骤,综合了多个高可信度来源的修复方案:
|
12月前
|
人工智能 监控 安全
优雅草星云智控系统产品发布会前瞻:SNMP协议全设备开启指南-优雅草卓伊凡
优雅草星云智控系统产品发布会前瞻:SNMP协议全设备开启指南-优雅草卓伊凡
247 12
优雅草星云智控系统产品发布会前瞻:SNMP协议全设备开启指南-优雅草卓伊凡
|
12月前
|
存储 关系型数据库 分布式数据库
PolarDB开源进阶篇:深度解析与实战优化指南
PolarDB是阿里云开源的云原生数据库,采用计算-存储分离架构,结合高性能共享存储与Parallel Raft多副本一致性协议,实现微秒级延迟和卓越性能。本文深入解析其架构设计,涵盖智能调度层、性能优化技巧(如查询优化器调优和分布式事务提升)、高可用与容灾配置、扩展功能开发指南以及监控运维体系。同时,通过电商平台优化案例展示实际应用效果,并展望未来演进方向,包括AI结合、多模数据库支持及Serverless架构发展。作为云原生数据库代表,PolarDB为开发者提供了强大支持和广阔前景。
600 16
|
人工智能 运维 Kubernetes
Websoft9 开源软件助力中小企业数字化的九大实战场景
本文探讨了开源软件在企业数字化转型中的核心价值,涵盖降本增效、灵活可控、技术前瞻性及生态协同等方面。同时,针对企业在开源应用中面临的挑战,如项目筛选、部署运维与系统集成难题,Websoft9提供了针对性解决方案。文章还解析了九大数字化实战场景,包括企业门户平台、智能数据分析、AI应用开发等,并给出了企业数字化实施路径建议。Websoft9通过“精选开源软件+标准化服务包”模式,已助力3000+企业实现数字化升级。
328 0
Websoft9 开源软件助力中小企业数字化的九大实战场景
|
机器学习/深度学习 人工智能 自然语言处理
LLMs 入门实战系列大全:LLMs应用、领域大模型介绍、大模型常见面经汇总
LLMs 入门实战系列大全:LLMs应用、领域大模型介绍、大模型常见面经汇总
LLMs 入门实战系列大全:LLMs应用、领域大模型介绍、大模型常见面经汇总
|
机器学习/深度学习 算法 测试技术
「软件项目管理」一文详解软件项目成本计划
该文章详细解释了软件项目成本估算的过程与方法,涵盖了代码行估算法、功能点估算法、用例点估算法、类比估算法、自下而上估算法、参数模型估算法及专家估算法等多种技术,并探讨了成本预算的制定步骤。
「软件项目管理」一文详解软件项目成本计划
|
安全 5G vr&ar

热门文章

最新文章