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

news2025/1/14 20:31:10

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

目录

一、算法模板:整数二分

二、例题


一、算法模板:整数二分

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

它们的主要区别在于①和②处 对 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;
}

二、例题

例题: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();
    }
}

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

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

相关文章

03 【Sass语法介绍-嵌套】

1.前言 在企业的实际项目开发中&#xff0c;Sass 的嵌套可以说是非常非常有用的&#xff0c;它可以让你的 CSS 代码易于管理和维护&#xff0c;看起来也比较清晰&#xff0c;这也是 Sass 中很基础的一个知识点&#xff0c;首先掌握这个至关重要&#xff01;在此章节我们将学习…

Golang题目总结

1. slice底层数据结构和扩容原理 数据结构 Go 的 slice 底层数据结构是由一个 array 指针指向底层数组&#xff0c;len 表示切片长度&#xff0c;cap 表示切片容量。扩容原理 &#xff08;1&#xff09;扩容思路&#xff1a;对于 append 向 slice 添加元素时&#xff0c;若 sl…

STM32-HAL-SPI-读写W25Q128FV-JEDEC ID(1)

文章目录 一、SPI串行通信协议1.1 SPI通信协议简介1.2 SPI工作原理1.3 SPI特性 二、W25Q128FV芯片介绍2.1 芯片基本参数介绍2.2 芯片管脚介绍2.3 技术手册等更多信息 三、开发板的板载Flash的连接电路四、测试准备五、初始化片上外设SPI15.1 初始化SPI15.2 设置片选引脚PB145.3…

【网页小功能 最简单入门!!!表白墙】【html+javaScript+css实现 简易 网页版 表白墙】

网页小功能 最简单入门&#xff01;&#xff01;&#xff01; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"…

详解达梦数据库字符串大小写敏感

检查数据库实例大小写敏感信息 场景一、初始化数据库实例为大小写敏感库 DDL操作 总结&#xff1a; 大小写敏感的数据库中&#xff1a; 创建表时&#xff1a; ①如果不对表名或列名添加""&#xff0c;那么表名和列名都自动转换为大写形式&#xff1b; ②如果对表…

自动化运维工具之Ansible

目录 一、自动化运维 1、通过xshell自动化运维 2、Ansible简介 3、Ansible特点及优势 4、Ansible核心程序 5、Ansible工作原理及流程 6、部署Ansible自动化运维工具 7、Ansible常用模块 (1) ansible命令行模块 (2) command模块 (3) shell模块 (4) cron模块 (5) us…

程序计算任意连续的12个月公里数不超三万公里预警

为了比亚迪的电池终身质保&#xff0c;写了个简单算法&#xff0c;计算任意12个连续的月份公里数加起来不超过3万公里的预警import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; import java.util.stream.Collectors;/***…

简单看看就会的tomcat全家桶(部署-多实例-监控-远程上传-日志-优化等)

tomcat学习 一&#xff0c;部署Tomcat 1.配置JDK环境 yum -y install java-1.8.0-openjdk-src.x86_64 #yum源安装JDK1.8 &#xff08;无须配置环境变量&#xff09;2.部署tomcat 下载地址&#xff1a;https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.87/bin/apache-tomcat-…

基于STM32+华为云设计的智慧烟感系统

一、概述 当前基于STM32和华为云,设计了一种智慧烟感系统,该系统可以检测烟雾,同时将检测到的数据上传到云端进行处理和分析。系统可用于家庭、办公室等需要安装烟雾报警器场所。 二、系统设计 2.1 系统硬件设计 【1】硬件平台 该系统主要使用STM32F103ZET6微控制器作为…

点成案例丨点成生物为苏州某药企完成水浴IQOQ验证

点成科普 在生物制药、食品卫生相关实验室中&#xff0c;实验室仪器对产品质量具有重要影响&#xff0c;而实验室仪器在投入使用前的3Q验证&#xff08;IQ、OQ、PQ&#xff09;则是通过设备验证进行产品质量保证的重要部分。3Q验证的具体含义如下&#xff1a; 安装验证 Inst…

Windows系统被faust勒索病毒攻击勒索病毒解密服务器与数据库解密恢复

在近期&#xff0c;一种名为faust后缀的勒索病毒威胁已经引起了全球计算机系统安全领域的关注。faust勒索病毒是一种基于RSA加密算法的恶意软件&#xff0c;能够加密目标计算机系统上的所有文件&#xff0c;并向用户勒索赎金来承诺解密恢复操作。下面为大家介绍一下Windows系统…

「 计算机网络 」TCP的粘包拆包问题

「 计算机网络 」TCP的粘包/拆包问题 参考&鸣谢 大病初愈&#xff0c;一分钟看懂TCP粘包拆包 雷小帅 TCP 的粘包拆包以及解决方案 一乐说 文章目录 「 计算机网络 」TCP的粘包/拆包问题一、前言二、为什么UDP没有粘包三、粘包拆包发生场景四、常见的解决方案五、Netty对粘包…

ChatGPT 平替天花板:HuggingFace 版 ChatGPT 来了,无需魔法无需等待直接起飞 ~

文章目录 ChatGPT 平替天花板&#xff1a;HuggingFace 版 ChatGPT 来了&#xff0c;无需魔法无需等待直接起飞 ~HuggingFace 简介HuggingChat 登场展望 ChatGPT 平替天花板&#xff1a;HuggingFace 版 ChatGPT 来了&#xff0c;无需魔法无需等待直接起飞 ~ 二话不说上链接 htt…

ChatGPT情商很高,但并不适合当搜索引擎

微软和谷歌正急于使用大型语言模型技术来强化搜索引擎。但有充分的理由认为&#xff0c;相比于提供事实性信息&#xff0c;这项技术更适合作为人们情感上的伴侣。 美媒评论称&#xff0c;目前基于大型语言模型的人工智能工具&#xff0c;例如ChatGPT&#xff0c;更擅长共情而不…

初访Chirper:一个禁止人类发言的人工智能社交网络,AI们居然在吵架,太6了

最近&#xff0c;在网上仅仅用ChatGPT和AI聊天已经不够刺激了&#xff0c;现在&#xff0c;AI已经有了属于自己的专属社区&#xff1a;Chirper 简而言之&#xff0c;这是一个禁止人类发帖、评论、转发的类推特网站。人类进去后只能看见&#xff1a;成千上万个AI聊天机器人在其…

[特征提取与匹配]基于Open CV使用SIFT提取特征,并使用FLANN完成单应性匹配

关于单应性 单应性&#xff1a;当一张图是另一张图的一个透视畸变时&#xff0c;在两张图中寻找彼此的一种情况 实现步骤 导入需要的库&#xff1b;读取两张灰度图像作为匹配对象&#xff1b;创建SIFT对象&#xff0c;用于检测SIFT特征点并计算描述子&#xff1b;在两张图像…

提效篇 |当项目紧急入场,如何先测量后校正?

施工队进场后&#xff0c;设计院还没交桩怎么办&#xff1f; 部分工程由于设计与施工间隔时间较久&#xff0c;导致控制点被破坏、复测未通过怎么办&#xff1f; 工期紧张&#xff0c;难道只能干等吗&#xff1f; 答案是&#xff1a;先测量后校正&#xff01;与常规RTK作业不…

tensorflow基础

tensorflow基础 &#xff08;一&#xff09;编程模型&#xff08;1&#xff09;编程模型中的运行机制&#xff08;2&#xff09;编写hello world程序&#xff08;3&#xff09;使用注入机制进行代码编写&#xff08;4&#xff09;保存和载入模型的方法介绍&#xff08;4.1&…

代码随想录|day58|单调栈part01 ● 739. 每日温度 ● 496.下一个更大元素 I

739. 每日温度 链接&#xff1a;代码随想录 今天正式开始单调栈&#xff0c;这是单调栈一篇扫盲题目&#xff0c;也是经典题。 大家可以读题&#xff0c;思考暴力的解法&#xff0c;然后在看单调栈的解法。 就能感受出单调栈的巧妙 fvfdvsf fdfd ddf fdd fd fsd 496.下一个更…

轻量级服务器nginix:如何实现Spring项目的负载均衡

这里写目录标题 一 生成war包并给数据库导入数据1.1生成war包1.2 向数据库中导入数据 二 启动Tomcat三 配置负载均衡并启动Nginx1.cent121这台虚拟机上2.检测两个tomcat的运行状态3.配置nginx4.启动4.1 nginx报错4.2 成功启动项目 四 命令总结 一 生成war包并给数据库导入数据 …