每日c/c++题 备战蓝桥杯(二分答案模版)

在算法学习中,二分答案算法是一种非常高效且常用的技巧。它的核心思想是通过不断缩小搜索范围,逐步逼近目标答案。相比传统的暴力搜索,二分答案算法的时间复杂度通常为 O(logn),特别适合处理大规模数据的查找问题。

本文将详细介绍二分答案算法的两种常见模板,并结合实际应用场景,帮助你更好地理解和使用这一算法。

二分答案算法的基本原理

二分答案算法的核心思想是:在一个有序的区间中,通过不断将区间分成两部分,判断答案可能存在的那一部分,从而逐步缩小搜索范围,最终找到目标答案

这种算法特别适合以下几种场景:

  1. 寻找符合要求的区间的最大值或最小值:例如,找到一个数组中第一个满足条件的元素。

  2. 寻找最大值的最小值:例如,在分配问题中找到最小的最大分配值。

  3. 寻找最小值的最大值:例如,在优化问题中找到最大的最小值。

这些场景通常难以通过传统的暴力搜索高效解决,而二分答案算法可以轻松应对。

二分答案算法的适用场景

在实际编程中,二分答案算法的应用非常广泛。以下是一些常见的适用场景:

  1. 寻找符合要求的区间的边界

    • 例如,找到一个有序数组中第一个大于等于某个值的元素。

    • 或者找到最后一个小于等于某个值的元素。

  2. 优化问题中的极值查找

    • 例如,在分配问题中,找到最小的最大分配值。

    • 或者在调度问题中,找到最大的最小时间间隔。

  3. 寻找满足条件的最优解

    • 例如,在矩阵中找到满足条件的最小元素。

二分答案算法的两种模板

模板一:查找左边界和右边界

查找左边界 (Search Left, SL)
int SL(int l, int r) {while (l < r) {int mid = l + r >> 1; // 等价于 (l + r) / 2if (check(mid)) r = mid;else l = mid + 1;}return l;
}
查找右边界 (Search Right, SR)
int SR(int l, int r) {while (l < r) {int mid = l + r + 1 >> 1; // 需要 +1 防止死循环if (check(mid)) l = mid;else r = mid - 1;}return r;
}

模板一的特点

  1. 查找左边界

    • mid 的计算方式为 (l + r) / 2

    • 如果 check(mid) 为真,则说明目标可能在左半部分,将右边界 r 更新为 mid

    • 否则,将左边界 l 更新为 mid + 1

  2. 查找右边界

    • mid 的计算方式为 (l + r + 1) / 2,这是为了避免死循环。

    • 如果 check(mid) 为真,则说明目标可能在右半部分,将左边界 l 更新为 mid

    • 否则,将右边界 r 更新为 mid - 1

模板二:另一种实现方式

查找左边界 (Search Left, SL)
int SL(int l, int r) {while(l <= r) {int mid = (l + r) >> 1;if(check(mid)) {r = mid - 1; // 继续在左半部分查找} else {l = mid + 1; // 继续在右半部分查找}}return l;
}
查找右边界 (Search Right, SR)
int SR(int l, int r) {while(l <= r) {int mid = (l + r) >> 1;if(check(mid)) {l = mid + 1; // 继续在右半部分查找} else {r = mid - 1; // 继续在左半部分查找}}return r;
}

模板二的特点

  1. 查找左边界

    • 如果 check(mid) 为真,则说明目标可能在左半部分,将右边界 r 更新为 mid - 1

    • 否则,将左边界 l 更新为 mid + 1

    • 最终返回 l,即左边界。

  2. 查找右边界

    • 如果 check(mid) 为真,则说明目标可能在右半部分,将左边界 l 更新为 mid + 1

    • 否则,将右边界 r 更新为 mid - 1

    • 最终返回 r,即右边界。

模板对比与适用场景

模板一的优点

  • 代码更简洁:逻辑清晰,适合快速实现。

  • 适用于精确查找边界:特别适合需要找到第一个满足条件的元素(左边界)或最后一个满足条件的元素(右边界)。

模板二的优点

  • 更统一:求mid的时候,不用分+1的情况

  • 更直观:容易理解,适合初学者。

  • 适用于范围查找:适合需要找到满足条件的元素范围的边界。

选择模板的建议

  • 如果你需要快速实现并确保代码简洁,可以选择模板一。

  • 如果你需要更直观的逻辑处理和更统一的模板,可以选择模板二。

模版的记忆方法

求左边界则返回L,求右边界则返回R

二分答案算法的实际应用

在实际编程中,二分答案算法的应用非常广泛。以下是一些常见的应用场景和示例:

示例 1:寻找符合要求的区间的最小值

假设你需要在一个有序数组中找到第一个大于等于某个目标值的元素。可以使用模板一的查找左边界方法。

bool check(int mid, int target, vector<int>& arr) {return arr[mid] >= target;
}int findFirstGreaterEqual(int target, vector<int>& arr) {int l = 0, r = arr.size() - 1;return SL(l, r);
}

示例 2:寻找最大值的最小值

例如,在分配问题中,你需要将一组物品分配给若干人,使得每个人分配到的物品总和的最大值最小。可以使用二分答案算法来寻找这个最小的最大值。

bool check(int mid, vector<int>& items, int k) {int cnt = 1, sum = 0;for (int item : items) {sum += item;if (sum > mid) {cnt++;sum = item;}}return cnt <= k;
}int findMinMaxAllocation(vector<int>& items, int k) {int l = *max_element(items.begin(), items.end());int r = accumulate(items.begin(), items.end(), 0);return SL(l, r);
}

示例 3:寻找最小值的最大值

例如,在调度问题中,你需要找到最大的最小时间间隔。可以使用二分答案算法来寻找这个最大的最小值。

bool check(int mid, vector<int>& times) {int cnt = 1, prev = times[0];for (int time : times) {if (time - prev >= mid) {cnt++;prev = time;}}return cnt >= required;
}int findMaxMinInterval(vector<int>& times, int required) {sort(times.begin(), times.end());int l = 0, r = times.back() - times[0];return SR(l, r);
}

总结

二分答案算法是一种非常强大的工具,特别适合解决以下几类问题:

  1. 寻找符合要求的区间的最大值或最小值。

  2. 寻找最大值的最小值。

  3. 寻找最小值的最大值。

通过本文介绍的两种模板,你可以根据具体问题选择合适的实现方式。模板一适合快速实现精确查找,而模板二则更适合处理复杂的边界条件。

希望本文能帮助你更好地理解和使用二分答案算法!如果你有任何问题或建议,欢迎在评论区留言。让我们一起探索算法的无限可能!

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

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

相关文章

NLP高频面试题(二十六)——RAG的retriever模块作用,原理和目前存在的挑战

在自然语言处理领域&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;是一种将信息检索与文本生成相结合的技术&#xff0c;旨在提升模型的回答准确性和信息丰富度。其中&#xff0c;Retriever在RAG架构中扮演着关键角色&am…

第30周Java分布式入门 分布式基础

分布式基础课程笔记 一、什么是分布式&#xff1f; 1. 权威定义 分布式系统定义为&#xff1a;“利用物理架构形成多个自治的处理元素&#xff0c;不共享主内存&#xff0c;通过发送消息合作”。 2. 核心解释 物理架构与处理元素 &#x1f31f; 多台独立服务器/电脑&#x…

Vuex状态管理

Vuex Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式管理应用的所有组件状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。&#xff08;类似于在前端的数据库&#xff0c;这里的数据存储在内存当中&#xff09; 一、安装并配置 在项目的…

从代码学习深度学习 - 使用块的网络(VGG)PyTorch版

文章目录 前言一、VGG网络简介1.1 VGG的核心特点1.2 VGG的典型结构1.3 优点与局限性1.4 本文的实现目标二、搭建VGG网络2.1 数据准备2.2 定义VGG块2.3 构建VGG网络2.4 辅助工具2.4.1 计时器和累加器2.4.2 准确率计算2.4.3 可视化工具2.5 训练模型2.6 运行实验总结前言 深度学习…

Baklib激活企业知识管理新动能

Baklib核心技术架构解析 Baklib的底层架构以模块化设计为核心&#xff0c;融合知识中台的核心理念&#xff0c;通过分布式存储引擎与智能语义分析系统构建三层技术体系。数据层采用多源异构数据接入协议&#xff0c;支持文档、音视频、代码片段等非结构化数据的实时解析与分类…

小智机器人中的部分关键函数,FreeRTOS中`xEventGroupWaitBits`函数的详细解析

以下是对FreeRTOS中xEventGroupWaitBits函数的详细解析&#xff1a; 函数功能 xEventGroupWaitBits用于在事件组中等待指定的位被设置。它可以配置为等待任意一个位或所有位&#xff0c;并支持超时机制。 注意&#xff1a;该函数不能在中断中调用。 函数原型 EventBits_t xEv…

关注分离(Separation of Concerns)在前端开发中的实践演进:从 XMLHttpRequest 到 Fetch API

关注分离&#xff08;Separation of Concerns&#xff09;在前端开发中的实践演进&#xff1a;从 XMLHttpRequest 到 Fetch API 一、关注分离的核心价值 关注分离&#xff08;SoC&#xff09;是软件工程领域的重要设计原则&#xff0c;强调将系统分解为不同维度的功能模块&am…

C之(16)scan-build与clang-tidy使用

C之(16)scan-build与clang-tidy使用 Author: Once Day Date: 2025年3月29日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Linux实践记录_Once_da…

在 Vue 项目中快速集成 Vant 组件库

目录 引言一、找到 src 下的App.js 写入代码。二、安装Vant三、解决 polyfill 问题四、查看依赖五、配置webpack六、引入 Vant七、在组件中使用 Vant八、在浏览器中查看样式总结 引言 在开发移动端 Vue 项目时&#xff0c;选择一个高效、轻量且功能丰富的组件库是提升开发效率…

“GPU 挤不动了?”——聊聊基于 GPU 的计算资源管理

“GPU 挤不动了?”——聊聊基于 GPU 的计算资源管理 作者:Echo_Wish “老板:为什么 GPU 服务器卡得跟 PPT 一样?” “运维:我们任务队列爆炸了,得优化资源管理!” 在 AI 训练、深度学习、科学计算的场景下,GPU 计算资源已经成为香饽饽。但 GPU 服务器贵得离谱,一台 A…

AI渗透测试:网络安全的“黑魔法”还是“白魔法”?

引言&#xff1a;AI渗透测试&#xff0c;安全圈的“新魔法师” 想象一下&#xff0c;你是个网络安全新手&#xff0c;手里攥着一堆工具&#xff0c;正准备硬着头皮上阵。这时&#xff0c;AI蹦出来&#xff0c;拍着胸脯说&#xff1a;“别慌&#xff0c;我3秒扫完漏洞&#xff0…

(二)GEE基础学习初探及案例详解【20250330】

Google Earth Engine(GEE)是由谷歌公司开发的众多应用之一。借助谷歌公司超强的服务器运算能力以及与NASA的合作关系&#xff0c;GEE平台将Landsat、MODIS、Sentinel等可以公开获取的遥感图像数据存储在谷歌的磁盘阵列中&#xff0c;使得GEE用户可以方便的提取、调用和分析海量…

redhat认证是永久的吗

​认证有效期 ​红帽认证一般有效期为3年​&#xff08;如RHCSA、RHCE、RHCA等&#xff09;&#xff0c;从通过考试之日起计算。 ​例外&#xff1a;部分基础或工程师认证&#xff08;如Red Hat Certified Engineer&#xff09;有效期为三年时间&#xff0c;以官方最新政策为准…

git --- cherry pick

git --- cherry pick cherry pick cherry pick Cherry Pick 是 Git 中的一个操作&#xff0c;它允许你选择某个分支的某次&#xff08;或多次&#xff09;提交&#xff0c;并将其应用到当前分支&#xff0c;而不会合并整个分支的所有更改。 cherry pick 的作用 只提取某个特定的…

妙用《甄嬛传》中的选妃来记忆概率论中的乘法公式

强烈推荐最近在看的不错的B站概率论课程 《概率统计》正课&#xff0c;零废话&#xff0c;超精讲&#xff01;【孔祥仁】 《概率统计》正课&#xff0c;零废话&#xff0c;超精讲&#xff01;【孔祥仁】_哔哩哔哩_bilibili 其中概率论中的乘法公式&#xff0c;老师用了《甄嬛传…

AI 的出现是否能替代 IT 从业者?

AI 的出现是否能替代 IT 从业者&#xff1f; AI 的快速发展正在深刻改变各行各业&#xff0c;IT 行业也不例外。然而&#xff0c;AI 并非完全替代 IT 从业者&#xff0c;而是与其形成互补关系。本文将从 AI 的优势、IT 从业者的不可替代性、未来趋势等方面&#xff0c;探讨 AI…

【leetcode100】有效的括号

1、题目描述 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…

为什么使用Flask + uWSGI + Nginx 部署服务?

概述 在Python开发的web应用中&#xff0c;我们通常能够看到flask、uWSGI、Nginx出现在一起&#xff0c;他们之间的关系是什么&#xff1f;为什么总是被应用在一起&#xff1f; &#xfeff; 三者共同使用为了实现一个目的&#xff1a;客户端向服务端发送数据请求&#xff0c;服…

接口等幂处理

介绍 ✅ 什么是等幂&#xff08;Idempotency&#xff09;&#xff1f; 等幂 无论这个操作被执行多少次&#xff0c;结果都是一样的&#xff0c;不会因为多次执行而产生副作用。 通俗一点说&#xff1a;“点一次和点一百次&#xff0c;效果是一样的。” ✅ 在接口中&#xff0…

P1090合并果子(优先队列)

洛谷题目 这里使用的是优先队列&#xff0c;非常简单 首先让我们一起来学习一下优先队列&#xff08;默认是从大到小来排列&#xff09; 首先要使用头文件 #include<queue> using namespace std; 然后声明有限队列 priority_queue<int> a; priority_queue&…