二分模板简单记忆

news2024/11/26 14:52:22

时间复杂度

O ( l o g n ) O(logn) O(logn)

三个模板

整数二分(两个)

int 答案右区间(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (在答案区间(mid)) r = mid;
        else l = mid + 1;
    }
    return l;
}

// ###############################################

int 答案左区间(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (在答案区间(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

浮点二分

double 浮点二分(double l, double r)
{
	double eps = 1e-6;
    while (l + eps < r)
    {
        double mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid;
    }
    return l;
}

两个整数二分模板的记忆

答案在右区间

在这里插入图片描述
现有如图所示的区间,我们现在给出目标:找到第一个大于5的元素
(关键要素:大于5)
根据这个关键要素,我们可以得到一个满足条件的区间,我们的答案也就在这个区间内。对应图中的蓝色区间,所以我们选用第一个模板。

这里的 check() 函数,对应的就是是否满足蓝色区间

因为我们的答案只会出现在边界位置,即蓝色箭头,所以我们每次更新区间,(l,r指针)往蓝色箭头靠。
那么,什么时候移动l,r指针?很简单,我们的mid在哪个区间,我们移动哪个指针!

  1. r=mid
    如下图,我们的mid,可能落在如下两个位置,因为mid在答案区间(右区间),所以我们移动r指针 r=mid。(为什么mid不需要减一?当mid为8时,因为不是答案我们可以减一,但是当mid为7时,我们减一,区间就指向5了,我们错过了正确答案,所以我们不能减一。也就是当mid在答案区间mid可能直接就是答案了,所以我们直接把答案mid赋值过去
    在这里插入图片描述

  2. l=mid+1:
    同理,当我们在左边区间,无论mid在哪,mid本身不可能是答案,所以我们没必要把mid留在区间内,可以多往后移动一格即mid+1,而mid+1刚好可能是答案
    在这里插入图片描述

  3. 所以,我们在赋值的时候,直接考虑mid刚好在两个区间边界位置即可

答案在左区间

在这里插入图片描述
当我们需要寻找最后一个小于等于5,我们可以得到红色答案区间

下面的方法都一样了:

  1. l=mid:
    当mid在左区间,我们需要更新l指针,mid可能正好是答案,所以直接l=mid。
  2. r=mid-1:
    当mid在右区间,我们更新r指针,mid-1可能是答案,所以r=mid-1
    在这里插入图片描述

那么,mid = l + r >> 1还是mid = l + r + 1 >> 1
什么时候+1?
可以用以下方法记忆:

  • 有-必有+
  • 答案在左区间容易死循环,让mid多加个一跑去右区间去

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

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

相关文章

Unity游戏源码分享-射击游戏Low Poly FPS Pack 3.2

Unity游戏源码分享-射击游戏Low Poly FPS Pack 3.2 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88057717

ES系列--打分机制

一、文档打分机制 当你通过关键字搜索相关文档时&#xff0c;可能会出现多个文档&#xff0c;这些文档的顺序是通过一个max_score属性的大小从高到低顺序展现出来的&#xff0c;max_score属性就是我们所说的评分。而这个评分是通过一个文档打分机制计算出来的。 二、打分原理 …

和鲸社区数据分析每周挑战【第九十八期:企业贷款审批分析】

和鲸社区数据分析每周挑战【第九十八期&#xff1a;企业贷款审批分析】 文章目录 和鲸社区数据分析每周挑战【第九十八期&#xff1a;企业贷款审批分析】一、背景描述二、数据说明三、问题描述四、数据加载五、数据清洗和预处理六、数据探索与分析1、贷款金额分布2、各州的贷款…

Vue渲染系统模块

我们想要实现一个简洁版的Mini-Vue框架&#xff0c;应该包含三个模块&#xff1a;分别是&#xff1a;渲染系统模块、可响应式系统模块、应用程序入库模块。 这篇就来写一下渲染系统模块。剩下两个模块后面有时间再更新。 vue渲染系统实现&#xff0c;应该包含三个功能&#x…

linux之Ubuntu系列(二)远程管理指令

shutdown shutdown 选项 时间 关机或重启 选项&#xff1a; -r 重新启动 提示 不指定选项和参数&#xff0c;默认表示1分钟之后 关闭电脑用SSH远程维护服务器时&#xff0c;最好不要关闭系统&#xff0c;而应该重新启动系统 -r shutdown常用示例 # 1分钟后关机 shutdown …

【C语言初阶(17)】初阶指针

文章目录 Ⅰ指针的概念Ⅱ 指针和指针类型⒈指针 - 整数⒉指针的解引用 Ⅲ 野指针⒈野指针成因⒉规避野指针 Ⅳ 指针运算⒈指针 - 整数⒉指针 - 指针⒊指针的关系运算 Ⅴ 指针和数组Ⅵ 二级指针Ⅶ 指针数组 Ⅰ指针的概念 指针的两个要点 指针是内存中一个最小单元的编号&#…

使用 torch.stft 进行短时傅里叶变换

python 常规的 stft 都是在 cpu 上进行计算&#xff0c;如果网络训练是在 GPU 上进行&#xff0c;那么就涉及到数据传输的问题&#xff0c;降低计算效率&#xff1b;而 torch 自带的 stft 可以直接在 GPU 上进行计算&#xff0c;因此可以节省计算时间。 import torch import t…

简单版本视频播放服务器V3-前端优化-播放器在左,列表在右侧【推荐】【完成】

做个家用版本的家庭影院&#xff0c;通过这个服务器可以给电脑&#xff0c;平板&#xff0c;手机等设备提供直接播放电影的作用&#xff0c;通过离线下载电影放入目录里就是就可以给全家提供电影播放了&#xff0c;通过浏览器就是可以访问电脑里面的视频&#xff0c;实现简单的…

Html基础知识学习——圣杯布局、margin负值、等高布局

文章目录 圣杯布局margin负值等高布局 圣杯布局 两边页面固定中间页面宽度随着浏览器大小自适应 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

代码随想录算法训练营day6 | 242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

目录 242. 有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 242. 有效的字母异位词 242. 有效的字母异位词 难度&#xff1a;easy 类型&#xff1a;哈希表 思路&#xff1a; 代码&#xff1a; class Solution {public boolean isAnagram(String s, St…

计算机网络 day9 DNAT实验

目录 DNAT DNAT策略的典型应用环境 DNAT策略的原理 在网关中使用DNAT策略发布内网服务器 DNAT实验&#xff1a; 实验环境&#xff1a; DNAT网络规划拓扑图&#xff1a; 步骤&#xff1a; 1、创建linux客户端Web网站&#xff08;go语言&#xff09;&#xff0c;实现Web服…

二、DDL-1.数据库操作

一、查询 1、查询所有数据库 show databases; MySQL自带的默认的数据库有四个&#xff1a; 二、创建 1、创建一个新的数据库itcast&#xff08;不区分大小写&#xff09;&#xff1a; create database itcast; 查询所有数据库&#xff1a;多了itcast 2、再创建同名的数据库…

Latex合并多个公式且居中

要求&#xff1a;1&#xff1a;多个公式居中对齐 2&#xff1a;多个公式组合只有一个编号。 结果类似于这一种&#xff1a; 代码&#xff1a;使用gathered可以。 \begin{equation}\begin{gathered}\vspace{0.6em}{E} {A(I)}\\\vspace{0.6em}{F} Conv(\sum_{i1}^3{M_i}) \\{…

可移植性测试包括哪些

可移植性测试 可移植性是指应用程序能够安装到不同的环境中&#xff0c;在不同的环境中使用&#xff0c;甚至可以移动到不同的环境中。当然&#xff0c;前两者对所有系统都很重要。就PC软件而言&#xff0c;鉴于操作系统、共存和互操作应用程序、硬件、带宽可用性等方面的快速…

AutoSAR EM执行管理模块01

1执行管理的作用&#xff1f; 管理应用AA的生命周期&#xff0c;啥时候启动&#xff0c;啥时候shut down。管理板子的启动和关闭&#xff0c;这里的板子跑的程序是最基本的程序&#xff0c;不包含业务逻辑的AA&#xff0c;可以理解为最小系统的程序。根据定义的执行依赖关系加载…

Appium Android ——利用 TestNG 并行执行用例

目录 前言&#xff1a; 一、测试类 二、连接两个 Android 设备或启动两个虚拟机 三、项目路径下新建两个 testng.xml 四、开启两个 appium server 五、导出依赖 六、执行测试 七、查看报告 前言&#xff1a; Appium是一个流行的移动应用自动化测试工具&#xff0c;…

PHP与Golang对战:两种语言的比较与应用场景探讨

引言 在软件开发领域&#xff0c;选择一种合适的编程语言对于项目的成功至关重要。而在今天的文中&#xff0c;我们将探讨两个备受争议的编程语言——PHP与Golang之间的对战。通过比较它们的优势和应用场景&#xff0c;帮助开发者更好地了解如何选择适合自己项目的语言。 PHP的…

vue3和vue2主要的一些区别?

一、Vue3介绍 关于vue3的重构背景&#xff0c;尤大是这样说的&#xff1a; 「Vue 新版本的理念成型于 2018 年末&#xff0c;当时 Vue 2 的代码库已经有两岁半了。比起通用软件的生命周期来这好像也没那么久&#xff0c;但在这段时期&#xff0c;前端世界已经今昔非比了 在我…

Spring 框架——事件驱动模型

目录 1.概述2.三种角色2.1.事件角色2.2.事件监听者角色2.3.事件发布者角色 3.示例 1.概述 &#xff08;1&#xff09;Spring 事件驱动模型是 Spring 框架中的一种编程模型&#xff0c;也被称为发布/订阅模型&#xff0c;通过使用观察者模式和事件机制&#xff0c;实现了组件之…