简记二分算法模板与代码案例:整数二分和浮点数二分

news2025/2/25 15:41:25

本文以 Java 语言实现,整理的代码模板适用于编程竞赛。对代码模板原理的讲解不多,主要记录一下如何使用。

目录

一、算法模板

(1)整数二分

(2)浮点数二分

二、例题

例题:acwing-789.数的范围

例题:数的平方根

例题:acwing-790.数的三次方根 


一、算法模板

(1)整数二分

整数二分有两套算法模板,这两套算法模板几乎涵盖了所有二分算法的题目。

它们的主要区别在于①和②处 对 mid 的赋值不同,相应的,右边界 r 与左边界 l 的值的更新也就不同。二分首先要做的是确定边界,整数二分的本质在于边界的判断。每次都必须选择答案所在的区间进行处理。

在运用下面两套模板时,先不要管细节;找到题干中要求的性质的边界后,先套上模板即可;然后再对边界点作出考虑:如果 check() 的值为 true,边界点包括不包括在目标区间内?根据这个问题的结果,填充:

if(check()) {
    ...    //填充
}else{
    ...    //填充
}

再根据实际填充的结果,对应到下面的模板,确定 mid 的赋值处是否要加一。 

// 检查x是否满足某种性质
boolean check(int 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;
        } else { 
            r = mid - 1;
        }
        
        return l;
}

(2)浮点数二分

浮点数二分与整数二分的逻辑是相同的。不过,由于浮点数的除法结果是浮点数,因此不存在边界问题,相对来说更加简单,也不用考虑mid取值加一减一的问题。


二、例题

例题:acwing-789.数的范围

解析:

这道题直接暴力是会超时的,最好的方法就是二分求解。

如果要查找起始点:

由上面的分析过程和代码模板可得如下代码:

// 二分找开始点
int l = 0, r = n-1;
while(l < r) {
    int mid = (l+r) >> 1;

    if(array[mid] >= k) {
        r = mid;
    }else{
        l = mid + 1;
    }
}

因为下面的步骤是 r = mid 和 l = mid + 1,所以, mid 的赋值即为 (l+r) >> 1,不用再更改为  (l+r+1) >> 1 。

然后二分查找终点

因此,得出查找终点的代码如下:

// 二分找结束点
l = 0;
r = n-1;
while(l < r) {
    int mid = (l+r+1) >> 1;

    if(array[mid] <= k) {
        l = mid;
    }else{
        r = mid - 1;
    }
}

题干可能不一定有解,但是二分的模板是一定有解的。二分后,通过性质,我们可以自行判断出无解的情况是什么。本题中,二分代码结束后 l 于 r 一定是相等的。此时,若 k 不等于 array[l],那么说明要查找的数不存在。 

结合题干要求的输入输出格式,补充完整代码:

import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        int n = reader.nextInt();   //数组长度
        int q = reader.nextInt();   //询问个数
        int[] array = new int[n];
        for (int i = 0; i < array.length; i++) {
            array[i] = reader.nextInt();
        }

        while(q != 0) {
            q--;
            int k = reader.nextInt();   //要查询的元素

            // 二分找开始点
            int l = 0, r = n-1;
            while(l < r) {
                int mid = (l+r) >> 1;

                if(array[mid] >= k) {
                    r = mid;
                }else{
                    l = mid + 1;
                }
            }
            //没找到
            if(array[l] != k) {
                System.out.println("-1 -1");
            }else {
                System.out.print(l + " ");
                // 二分找结束点
                l = 0;
                r = n-1;
                while(l < r) {
                    int mid = (l+r+1) >> 1;

                    if(array[mid] <= k) {
                        l = mid;
                    }else{
                        r = mid - 1;
                    }
                }
                System.out.println(l);

            }
        }
        reader.close();
    }
}

例题:数的平方根

用浮点数二分的方法,求输入一个数 x 的平方根。结果保留6位小数。 

由此,可以得出代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        double x = reader.nextDouble();

        double l = 0, r = x;
        while(r - l >= 1e-8) {
            double mid = (l+r)/2;
            if(mid * mid >= x) {
                r = mid;
            }else{
                l = mid;
            }
        }
        System.out.printf("%.6f", l);
        reader.close();
    }
}

注意,若题干要求结果保留6位小数,精度就设为1e-8,若题干要求保留4位小数,精度就设为1e-6

要求保留几位小数,就把精度设置的比要求的大 2 位。

例题:acwing-790.数的三次方根 

首先我们要识别出,这道题可用浮点数的二分来解。

二分首先要确定边界,该题中,可以直接将数的区间范围确定为 -10000~10000。与求平方根同理:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        double n = reader.nextDouble();
        double l = -10000, r = 10000;
        while(r - l >= 1e-8) {
            double mid = (l+r)/2;
            if (mid * mid * mid >= n) {
                r = mid;
            } else {
                l = mid;
            }
        }

        System.out.printf("%.6f", l);
        reader.close();
    }
}

数的立方根同题也在蓝桥杯中考过:蓝桥-解立方根 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/469020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源网安入选“2023年中国信通院开源供应商名录”

近日&#xff0c;为进一步推进开源供应链安全合规发展&#xff0c;中国信息通信研究院云大所发布了“2023年中国信通院开源供应商名录”&#xff08;简称名录&#xff09;&#xff0c;名录供应商均为通过可信开源供应链系列评估的企业。名录范围涵盖云计算、大数据、中间件、数…

【致敬未来的攻城狮计划】第1期 作业汇总贴 + 获奖公布

​ 文章目录 一、写在前面二、种子学员介绍三、作业贴汇总四、小小总结五、获奖公布六、学员有话说七、特别致谢 一、写在前面 时间过得真快&#xff0c;距离 【致敬未来的攻城狮计划】第1期 的发起&#xff0c;已经过去一个多月了&#xff0c;而第1期的真正学习考核期也将在…

虹科案例 | 如何通过智能、非接触式测量解决方案,提高起重机的安全和效率?

PART 1 案例详情 自建造初期以来&#xff0c;起重机行业已经走了很长一段路。技术的使用在行业进步中发挥了重要作用&#xff0c;降低了使用桥式起重机的危险性。特别是&#xff0c;智能、非接触式测量解决方案通过使用高架升降机更安全、更高效、更高效&#xff0c;为行业的进…

如何将化学分子SMILES字符串转化为Pytorch图数据结构——ESOL分子水溶性数据集解析

硬核原创&#xff0c;转载请注明出处&#xff1a; https://leytton.blog.csdn.net/article/details/130406553 一、前言 在用Pytorch图神经网络对化学分子进行数据分析的时候&#xff0c;经常使用现有的数据集。看到自动处理完毕的数据结构&#xff0c;里面的特征值让我们一脸…

springsecurity工作流程

Spring Security 的工作流程如下: 1.当用户请求一个受保护的资源时,Spring Security 的过滤器链会拦截该请求。 2.然后 Spring Security 会判断该请求是否认证(authenticated)和授权(authorized)。 认证(Authentication):验证用户身份,判断用户是否能登录系统。Spring Securi…

Linux应用编程(线程同步)(互斥锁)

对于一个单线程进程来说&#xff0c;它不需要处理线程同步的问题&#xff0c;所以线程同步是在多线程环境下可能需要注意的一个问题。线程的主要优势在于&#xff0c;资源的共享性&#xff0c;譬如通过全局变量来实现信息共享&#xff0c;不过这种便捷的共享是有代价的&#xf…

docker网桥冲突解决方法

Docker网桥网段冲突导致访问不到容器问题 三种情况 一、docker0所用网段与局域网所用网段相同&#xff0c;导致网桥冲突&#xff0c;这会造成冲突网段无法访问docker服务。 解决办法&#xff1a; 1.停止docker&#xff0c;删除冲突网桥 systemctl stop docker ip link del doc…

干货 | 中科院心理所考研复试经验分享

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐&#xff5e; 此时此刻&#xff0c;23年考研的小伙伴估计正在为复试进行准备吧&#xff0c;大家都准备得怎么样了呢&#xff1f; 今天为大家带来的就是我国顶级心理学研究结构—中科院心理所…

leetcode19_删除链表的倒数第 N 个结点

文章目录 题目详情分析Java代码实现 题目详情 leetcode19 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 分析 暴力的方法&#xff0c;两趟遍历&#xff0c;第一个遍历记录总的节点数目&#xff0c;第二次遍历到总结点数-N个位置&…

PyTorch——利用Accelerate轻松控制多个CPU/GPU/TPU加速计算

PyTorch——利用Accelerate轻松控制多个CPU/GPU/TPU加速计算 前言官方示例控制多个CPU/GPU/TPU简单说一下设备环境导包加载数据 FashionMNIST创建一个简单的CNN模型训练函数-只包含训练训练函数-包含训练和验证训练 参考链接 前言 CPU&#xff1f;GPU&#xff1f;TPU&#xff…

边学边记——数据结构☞关于对象的比较(包括对equals()方法的重写,Comparable接口,Comparator接口的介绍)

目录 一、基本类型 二、引用类型——对象的比较 1. 关于同一性的比较 2. 关于相等性的比较 三、Comparable接口 1. 介绍 2. 实现 3. 什么叫做正确的compareTo方法的重写 四、实现Comparator接口&#xff08;基于比较器比较&#xff09; 1. 介绍 2. 实现 3. 使用场景…

CentOS防火墙的常用快捷命令

CentOS是免费开源的Linux发行版之一,它兼容RHEL并由社区进行维护,大多数美国服务器提供对该系统支持。在使用CentOS系统时,您需要了解一些常用命令,比如开启、查看、关闭防火墙等。本文将介绍下CentOS防火墙的常用命令。 CentOS是一种面向企业级服务器环境的Linux发行版,…

D触发器仿真实验

关于D触发器的内容见专栏的单片机原理及应用&#xff0c;主要是时钟脉冲出现时候&#xff0c;会改变输出状态。 下面来做一个D触发器的仿真实验。 部件 使用74LS74&#xff1a;带清除和预置端功能的双上升沿D型触发器 74LS74是一款现代集成电路芯片&#xff0c;属于TTL&…

火爆全网,测试用例技巧-Python实现XMind测试用例转Excel测试用例

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试&#x…

Jenkins中Changelog插件使用

Jenkins中Changelog插件使用 通过changlog插件获取每次提交的变更信息 一、安装changelog插件 二、使用changelog 1、新建项目&#xff0c;在构建环境中勾选Add Changelog Information to Environment &#xff0c;输入对应的格式 %3$s(datetime-at%4$s via%1$s) %2$s(type%…

聚焦智慧燃气,美格智能亮相第25届中国国际燃气、供热技术与设备展览会

4月25~27日&#xff0c;第25届中国国际燃气、供热技术与设备展览会在深圳会展中心&#xff08;福田&#xff09;盛大举办。本次展会由中国城市燃气协会主办&#xff0c;自1994年举办以来已历经24届&#xff0c;是国内燃气行业规模巨大的综合性专业展会。美格智能携4G/5G模组、N…

Typora中的数学公式(MarkDown)

Typora中的数学公式&#xff08;MarkDown&#xff09; 添加数学公式方式&#xff1a; 1.选择&#xff1a;段落>公式 2.快捷键&#xff1a;Ctrl Shift M 3.直接输入两个美元符号并回车 展示&#xff1a; 空格&#xff1a;一个斜线\ : a \ b a b a \ b a b 换行&#x…

【河南省第二届技能大赛-物联网技术】C模块Python开发讲解

文章目录 前言题目如下什么是云平台APIAPI调用的基本流程Python实例介绍依赖库介绍API调用的基本参数请求返回值requests库PyQt5库总结源码链接 前言 这是基于样题进行讲解的文章&#xff0c;因为正式赛题尚未公布和样题类型相似。文章结尾提供了源码和环境链接&#xff0c;读…

四面阿里,成功入职阿里测试开发,分享我的真实面试题

闲话少叙 直接上干货 鉴于篇幅所限&#xff0c;这里不放答案&#xff0c;有需要的朋友可以评论区自取 1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 2. 平时工作中是怎么去…

【面试题】你都必须得掌握的vue知识

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 大家好&#xff0c;我是前端贰货道士。最近抽空整理了下我对vue2.x的理解和认知&#…