二分法中的两个模板

news2024/11/26 23:33:42

在acwing的算法基础课中,yxc给出了二分的两个模板,这里举有序数组查找某个数的例子来说明这两个模板。

模板1:

当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid +1;,计算mid时不需要加1。
此操作用于check条件是获取右半部分的第一个元素。

int bsearch_1(int l, inr r){
    while(l<r){
        int mid = l+r>>1;
        if (check(mid)) r=mid;
        else l=mid+1;
    }
    return l;
}

模板2:

当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l =mid;,此时为了防止死循环,计算mid时需要加1。
此操作用于获得左半部分的最后一个元素。

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;
}

在这里插入图片描述
在这里插入图片描述

比如我们有一个有序数组,我们需要找到6的位置,我们可以将数组划分为两个部分,前半部分是小于6的部分,后半部分是大于等于6的部分,那么我们就有两种check的实现方式,分别对应取左半部分的最后一个<=6和取右半部分>=6的第一个:

  1. a[mid]>=6
    此时check函数对应第二部分,即原数组中>=6的部分。
    检查mid是否大于等于6,即我们需要获得第二部分中的第一个元素,其就是最终的答案。
    此时使用第一个模板
#include<iostream>
#include<vector>
using namespace std;

int main(){
	vector<int> a = {1,2,3,4,5,6,7,8,9};
	int l = 0;
	int r = a.size();
	while(l < r){
		int mid = (l + r)>>1;
		if(a[mid] >= 6) r = mid;
		else l = mid + 1;
	}
	cout << l;
	return 0;
} 
  1. a[mid]<=6
    此时check函数对应第一部分,即原数组中<=6的部分。
    检查mid是否小于等于6,即我们需要获得第一部分中的最后一个元素,其就是最终的答案。
    此时使用第二个模板
#include<iostream>
#include<vector>
using namespace std;

int main(){
	vector<int> a = {1,2,3,4,5,6,7,8,9};
	int l = 0;
	int r = a.size();
	while(l < r){
		int mid = (l + r + 1)>>1;
		if(a[mid] <= 6) l = mid;
		else r = mid - 1;
	}
	cout << l;
	return 0;
} 

为什么第二个模板需要l+r+1/2
因为如果r=l+1的时候,不+1的话mid就会等于l,如果进入check条件就会进入死循环。

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

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

相关文章

用Go实现yaml文件节点动态解析

1.摘要 在大多数Go语言项目中, 配置文件通常为yaml文件格式, 在文件中可以设置项目中可灵活配置的各类参数, 通常这类参数都是比较固定的, 可以将其映射为对应的结构体在项目中进行使用, 如果需要调整参数时, 只需要增减结构体参数字段内容即可。 但同时还存在另外一种情况, …

【PG】PostgreSQL高可用方案repmgr部署(非常详细)

目录 简介 1 概述 1.1 术语 1.2 组件 1.2.1 repmgr 1.2.2 repmgrd 1.3 Repmgr用户与元数据 2 安装部署 2.0 部署环境 2.1 安装要求 2.1.1 操作系统 2.1.2 PostgreSQL 版本 2.1.3 操作系统用户 2.1.4 安装位置 2.1.5 版本要求 2.2 安装 2.2.1 软件包安装 2.2…

git分支管理以及不同git工作流对比

0、 单人开发场景 单人开发可能会出现的场景之一 如果多人协同开发我们则需要使用更加专业的工具Git&#xff08;分布式版本控制&#xff09; 1、多人协同工作使用git会出现什么问题? 代码冲突&#xff1a; 问题&#xff1a; 当多个开发者同时修改同一文件或同一行代码时…

embedding的综述

1 一文读懂Embedding的概念&#xff0c;以及它和深度学习的关系 one-hot 变成地位稠密的向量&#xff0c;降维 什么是词嵌入&#xff1a;讲词汇表中的词或者词语映射成固定长度的向量。 具体过程&#xff1a; one-hot变成低维连续的向量 语义相近的词语&#xff0c;词语赌…

大模型的实践应用6-百度文心一言的基础模型ERNIE的详细介绍,与BERT模型的比较说明

大家好,我是微学AI,今天给大家讲一下大模型的实践应用6-百度文心一言的基础模型ERNIE的详细介绍,与BERT模型的比较说明。在大规模语料库上预先训练的BERT等神经语言表示模型可以很好地从纯文本中捕获丰富的语义模式,并通过微调的方式一致地提高各种NLP任务的性能。然而,现…

英伟达中国特供芯片是缩水版;华为 Mate60 Pro 国产零件价值占比 47%丨 RTE 开发者日报 Vol.84

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

这个双11,谁赚了?

双11落幕&#xff0c;很多品牌迎来一年中最重要的一次生意爆发&#xff0c;但作为普通消费者&#xff0c;还是能感受到今年双11的消费氛围减弱了&#xff0c;一方面&#xff0c;电商大促驱向常态化&#xff0c;双11不一定是全年最低价&#xff0c;“有需要再买”的心态越来越多…

人工智能学院承办南山区区块链公益职业技能培训

11月4日&#xff0c;南山区人力资源局主办、深圳职业技术大学承办的2023年南山区公益职业技能培训项目——区块链技术应用项目&#xff0c;于当天在深圳职业技术大学西丽湖校区图书馆西厅正式开班。此次培训将持续至11月18日。南山区人力资源局职业能力建设科科长张仁勇、人工智…

微服务简单理解与快速搭建

分布式和微服务 含义 微服务架构 微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法&#xff0c;每个服务运行在自己的进程中&#xff0c;服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服…

解密网络世界的秘密——Wireshark Mac/Win中文版网络抓包工具

在当今数字化时代&#xff0c;网络已经成为了人们生活和工作中不可或缺的一部分。然而&#xff0c;对于网络安全和性能的监控和分析却是一项重要而又复杂的任务。为了帮助用户更好地理解和解决网络中的问题&#xff0c;Wireshark作为一款强大的网络抓包工具&#xff0c;应运而生…

springboot+maven多环境动态配置,以及编译失败的解决方案

一、前言 在我们的项目开发过程中一般会有多套的环境&#xff0c;比如比较常见的会有三套&#xff1a; dev &#xff08;研发环境&#xff09;&#xff0c;test(测试环境)&#xff0c;prod&#xff08;生产环境&#xff09;。 application.yml 是主配置文件&#xff0c;当在不…

Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对这篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿 目录 1、复习 MySQl 事务的特性 2、Redis 事务特性 2.1、原子…

Debug知识点解析!超实用教程

一、Debug简介 二、IDEA中的Debug步骤 2.1 步过调试按钮(F8) 2.2 步入调试按钮(F7) 2.3 强制步入调试按钮(Alt Shift EZ) 2.4 步出调试按钮(Shift F8) 2.5 回退断点 2.6 运行到光标处&#xff08;F9&#xff09; 2.7 计算表达式按钮(Alt F8) 三、条件断点 在断点处右…

Project IDX简介——这是一项改进全栈、多平台应用程序开发的试验

如今&#xff0c;将应用程序从零开发到生产环境&#xff08;尤其是在移动、网络和桌面平台上运行良好的应用程序&#xff09;感觉就像构建一台 Rube Goldberg 机器。您必须在无尽的复杂性海洋中航行&#xff0c;将各种技术堆栈粘合在一起&#xff0c;以引导、编译、测试、部署和…

基于逐次变分模态分解(SVMD)联合小波阈值去噪

代码原理 逐次变分模态分解 (Iterative Variational Mode Decomposition, IVMD) 是一种信号分解方法&#xff0c;它可以将一个时域信号分解为若干个本征模态函数&#xff08;Intrinsic Mode Functions, IMF&#xff09;。它通过迭代寻找信号的本征模态函数和残差部分&#xff…

Ladybug 全景相机, 360°球形成像,带来全方位的视觉体验

360无死角全景照片总能给人带来强烈的视觉震撼&#xff0c;有着大片的既视感。那怎么才能拍出360球形照片呢&#xff1f;它的拍摄原理是通过图片某个点位为中心将图片其他部位螺旋式、旋转式处理&#xff0c;从而达到沉浸式体验的效果。俗话说“工欲善其事&#xff0c;必先利其…

.net core中前端vue HTML5 History 刷新页面404问题

放到启动的应用程序的最后面 app.Run(async (context) > {context.Response.ContentType "text/html";await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); });https://blog.csdn.net/lee576/article/details/88355…

强化学习:原理与Python实战||一分钟秒懂人工智能对齐

文章目录 1.什么是人工智能对齐2.为什么要研究人工智能对齐3.人工智能对齐的常见方法延伸阅读 1.什么是人工智能对齐 人工智能对齐&#xff08;AI Alignment&#xff09;指让人工智能的行为符合人的意图和价值观。 人工智能系统可能会出现“不对齐”&#xff08;misalign&…

647. 回文子串 516.最长回文子序列

647. 回文子串 题目&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相…

ubuntu18.04配置Java环境与安装RCS库

一、安装包 安装包 二、JAVA环境 java无需安装&#xff0c;只需要下载解压&#xff0c;然后配置正确的路径到环境变量种即可使用。 1.创建文件JAVA mkdir JAVA 2.将安装包复制到该文件夹下&#xff0c;并解压缩 tar -zxvf tar -zxvf jdk1.8.0_191.tar.gz 3.在home路径下…