二分查找算法(整数和浮点数)

2023-11-18

一、整数二分模板

二分核心思想: 选择区间,每次都保证答案在被选择的区间内,循环往复。

整数二分有两种情况

  • 第一种是区间[l, r]被划分成[l, mid][mid + 1, r]时使用:
bool check(int x) {/* ... */ } // 检查x是否满足某种性质
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]时使用:
bool check(int x) {/* ... */ } // 检查x是否满足某种性质
int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

二分查找两个模板的运用:

求数的范围

题目描述:

输入一组升序序列,求序列中某个数的下标范围,如1 2 2 2 3 3 4 5中2的下标范围是[1,3]

题解源码:

#include<iostream>
using namespace std;

const int N = 100010;
int a[N];

int main()
{
	int n, q, k;//n序列长度,q询问次数,k所求的数
	cin >> n >> q;
	for (int i = 0; i < n; ++i) cin >> a[i];
	while (q--) {
		cin >> k;
		int l = 0, r = n - 1;
		while (l < r) //二分模板一
		{
			int mid = l + r >> 1;
			if (a[mid] >= k) r = mid;
			else l = mid + 1;
		}
		if (a[l] == k) //判断数组中是否有k这个数
		{
			cout <<"[" << l << ",";
			l = 0, r = n - 1;
			while (l < r)//二分模板二
			{
				int mid = l + r + 1 >> 1;
				if (a[mid] <= k) l = mid;
				else r = mid - 1;
			}
			cout << l <<"]";
		}
	}
}

二、浮点数的二分

浮点数的二分比较简单,只有一种情况

浮点数二分模板

bool check(double x) {/* ... */ } // 检查x是否满足某种性质
double bsearch_3(double l, double r)
{
    const double eps = 1e-6;   // eps 表示精度,取决于题目对精度的要求
    while (r - l > eps)
    {
        double mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid;
    }
    return l;
}

求x的三次方根

题目描述:

用二分算法求一个数x的三次方根,-10000<=x<=10000,精度要求1e-6

题解源码:

int main()
{
	double x;
	cin >> x;
	double l = -10000, r = 10000;
	while (r - l > 1e-8)//一般这里比题目要求的精度精确两位
	{
		double mid = (l + r) / 2;
		if (mid * mid * mid >= x) r = mid;
		else l = mid;
	}
	printf("%.6lf\n", l);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二分查找算法(整数和浮点数) 的相关文章

随机推荐

  • R语言基础图形元素——坐标轴和网格线

    R语言基础图形元素 坐标轴和网格线 简介 1 坐标轴 2 网格线 参考书籍 简介 坐标轴为图中元素数值大小提供了参照 绘图时 时常需要实现坐标轴的个性化绘制 可以通过axis 函数实现 网格线是图形的一种辅助线 可以实现图中元素更加精确把控
  • R语言作图:坐标轴设置

    R语言作图 坐标轴设置 偷闲阁 2018 02 04 20 51 24 209654 收藏 359 分类专栏 R语言 可视化 文章标签 R 坐标轴 刻度 可视化 版权声明 本文为博主原创文章 遵循 C
  • 小白用Python抓取豆瓣高评分喜剧电影

    目的 抓取豆瓣高评分喜剧电影 导入所需的库 import requests 进行模拟浏览器进行发送请求 import json 导入JSON类型的库 不会导入库的话 请参考我的上一篇文章 上面有提及 小白如何抓取网页 进行确定URL和浏览器
  • 开发gitlab-reporting周报项目的总结

    一 方案设计 二 数据库设计 三 代码设计 从gitlab项目中输出每个成员的周报 事件触发webhook 接收webhook的server server解析webhook事件 做一个周报生成器 用gitlab的issues生成周报 功能
  • WebGL 视图矩阵、模型视图矩阵

    目录 立方体由三角形构成 视点和视线 视点 观察目标点和上方向 视点 观察目标点 上方向 在WebGL中 观察者的默认状态应该是这样的 视图矩阵程序 LookAtTriangles js 实际上 根据自定义的观察者状态 绘制观察者看到的景象
  • 【插件】谷歌浏览器插件visio在线打开vsdx文件

    下载地址
  • 【牛客C++入门】CPP10 判断成绩等级

    描述 键盘录入一个成绩 整数 判断并输出成绩的等级 如果用户输入成绩不合法 小于0或者大于100 则输出成绩不合法 90 100 优秀 80 89 良 70 79 中 60 69 及格 0 59 差 输入描述 输入学生的成绩 整数 输出描述
  • 最美应用API接口分析

    最美应用API接口分析 最美应用API接口分析一 请求版本列表1 1 API二 请求应用配置2 1 API2 2参数列表2 3 返回三 友盟更新3 1 API3 2参数列表3 3 返回四 appleStore应用信息4 1API4 2 返回
  • 发布npm包-简要记录

    1注册账号 注册npm账号 需要邮箱 激活npm账号 npm账号注册成功以后会收到邮件 邮件中有个链接 点进去进行激活 2创建项目 npm init 创建项目 name 命名规则 不能包含大写字母 空格及下滑线 version 创建时候默认
  • Shiro源码分析-初始化-SecurityManager

    源码分析的第一篇以SecurityManager的初始化为题 根据ini配置文件初始化shiro的代码主要为两段 解析ini文件为Ini对象 Factory
  • 电商行业常用指标

    首先要构建电商数据分析的基本指标体系 主要分为8个类指标 即 1 总体运营指标 从流量 订单 总体销售业绩 整体指标进行把控 起码对运营的电商平台有个大致了解 到底运营的怎么样 是亏是赚 2 网站流量指标 即对访问你网站的访客进行分析 基于
  • 【Python】pip安装源、pip config命令 及 pip安装包位置 等相关问题

    永久性添加pip安装源 查看pip文件的存储位置有 查看pip config 的配置方法 删除配置信息 查看pip下载的安装包的默认路径 查看如何修改安装位置 永久性添加pip安装源 pip config set global index
  • F5 BIG-IP LTM基础资料

    F5 BIG IP网络概述 TMOS是一个全代理的体系结构 流量必须穿越BIG IP设备以获得TMOS的优化效果 部署方式 路由模式 也被称作串联模式 真实服务器放在BIG IP之后的一个内部网络 真实服务器的网关需要指向 或者最终通过 B
  • qsort的基本用法

    qsort的基本用法 在我们日常的刷题中 我们经常遇见一些需要排序的问题 有的时候我们会直接运用循环以及选择结构来暴力排序 或者使用比较简单的冒泡排序等排序方法 这些都是直接运用我们C语言或者C 里的底层代码来实现 今天我将介绍一种较为简单
  • Unity3D中通过代码修改子物体层级的顺序

    今天有个同事问我如何在程序中修改子物体的层级关系来改变遮挡关系 我给他敲出来一句代码 UI的层级关系是通过渲染表现出来的 在canvas下的物体 排序越靠前的越先被渲染 这样一来就会 被后来渲染的遮挡 总结一下有三句代码是修改子物体的层级的
  • 用java实现输入成绩,判断等级

    用java里的Scanner类实现输入成绩 用if判断成绩等级 代码如下 用java实现输入成绩 判断等级 导包 import java util Scanner public class Exercise public static vo
  • k8s基础5——Pod常用命令、资源共享机制、重启策略和健康检查、环境变量、初始化容器、静态pod

    文章目录 一 基本了解 二 管理命令 三 yaml文件参数大全 四 创建pod的工作流程 五 资源共享机制 5 1 共享网络 5 2 共享存储 六 生命周期 重启策略 健康检查 七 环境变量 八 Init Containe初始化容器 九 静
  • 大神之路-起始篇

    欢迎关注 WeiyiGeek 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 全栈实践 再到 放弃学习 涉及 网络安全运维 应用开发 物联网IOT 学习路径 个人感悟 等知识 花开堪折直须折 莫待无花空折枝 本章目
  • 【STM32学习】(19)STM32实现直流电机测转速(霍尔传感器)

    最近在学习STM32单片机 本次博文想记录一下32单片机连接霍尔传感器来测量直流电机转速 材料准备 1 单片机 STM32L052K8 2 霍尔传感器 3 直流电机 电路图如下 其中 单片机和直流电机不用介绍 下面介绍一下霍尔传感器 主要想
  • 二分查找算法(整数和浮点数)

    二分查找算法 一 整数二分模板 二 浮点数的二分 一 整数二分模板 二分核心思想 选择区间 每次都保证答案在被选择的区间内 循环往复 整数二分有两种情况 第一种是区间 l r 被划分成 l mid 和 mid 1 r 时使用 bool ch