蓝桥杯 临时抱佛脚 之 二分答案法与相关题目

二分答案法(利用二分法查找区间的左右端点)

(1)估计 最终答案可能得范围 是什么

(2)分析 问题的答案 给定条件 之间的单调性,大部分时候只需要用到 自然智慧

(3)建立一个f函数, 当答案固定的情况下 ,判断 给定的条件是否达标

(4)在 最终答案可能的范围上不断二分搜索, 每次用f函数判断,直到二分结束,找到最合适的答案

(5)当题目要查找一个区间的左右端点时(符合的区间有多个值找最大或者最小),可以考虑一下这个方法能不能用

综上:

        核心点:分析单调性,建立f函数

光说不练,假把式!开练!!!!!

下面有一些相关题目

题目一:爱吃香蕉的珂珂

测试链接:875. 爱吃香蕉的珂珂 - 力扣(LeetCode)

题解:

1.        先看问题答案与对应条件的单调性,这道题中当吃香蕉的速度越大时,吃完所需要的时间就会越少,但这道题中要注意如果一小时内吃完一堆香蕉就会休息,等到下一个小时才会再次开始吃,如果一小时内没有吃完,那么下一个小时就会继续吃,吃完之后还是不会继续吃其他堆的香蕉,还是会休息。所以这个题会用到向上取整算法( 例如a/b向上取整,(a+b-1)/b

2.         分析要二分什么,问题要求返回h小时内吃掉所有香蕉的最小速度k(k为整数),那这道题就是二分速度,并且速度与时间也符合单调性,速度也快,时间越短。考虑二分速度的左右区间,左区间 速度最小为1 最大速度为数组中最大数据的大小,因为如果速度大于最大数据时,吃完之后也不会继续吃下一堆还是会休息,又有单调性所以最大数据的速度一定可以,但不会是答案。

3.        check函数,参数传速度,返回吃完所需要的时间,然后与给定的k作对比,不断的缩小范围直到二分结束,返回答案。

class Solution {
public:int minEatingSpeed(vector<int>& piles, int h) {//定区间int r = 0;//找到数组中最大的数据作为区间的右端点for(int i=0; i<piles.size();i++){r = max(piles[i],r);}int ans = 0;//速度最小为1,左端点设置为1int l = 1;int mid =0;while(l<= r){// 等价于mid = (l+r)/2  但有时会越界防止越界mid = l+((r-l)>>1); // 二分点靠左if(check(piles,mid) <= h){//达标//记录答案ans = mid;r = mid-1;}else{//不达标//不记录答案直接去右面二分l = mid+1;}}return ans;}//check函数检查是否符合要求long long check(vector<int>& piles, int mid){//时间是向上取整 ,初始化long long类型数据,防止数据过大越界long long ans = 0;    // ans为时间int i = 0;int size = piles.size();while(size--){// 时间是向上取整的ans += (piles[i++]-1)/mid + 1;}//返回mid速度,吃完所需时间return ans;}
};

题目二:分割数组的最大值

题目链接:410. 分割数组的最大值 - 力扣(LeetCode) (画匠问题)

题解:

1.        总结题意就是将数组分成规定的份数,然后返回分好的这些组中各自和的最大值的最小(就是组内的和最大的组的和使这个数即可能的小返回最小)

2        先看看这道题中最终答案,与给定条件之间是否存在单调性,最答案是各自总和的最大值,给定条件为划分成几份,当划分的分数越多,各自的总和就会越小,存在一定的单调性。

3.        思路就是写一个函数,传递的参数就是各自总和的最大值,然后返回满足在这个限制下,会将数组分成几份,然后与给定的k作对比,不断地缩小区间,直至二分结束

方法一:

        在后面check函数中处理特殊情况(容易忘记处理)

class Solution {
public:int splitArray(vector<int>& nums, int k) {//二分答案 将最大部分的累加和一直二分,写一个函数(每组数据都限制在这个累加和的范围内时是否符合要求小于等于k个)判断//非负整数可以为0//在前面可以将区间缩小到最小然后可以避免后面细节的判断防止出错//改法将左端点设置为最小0int l = 0;//二分区间的右端点,就是累计和的最大也就是将数组分成一份就是数组中所有元素的累加和 int r = 0;for(int i = 0; i<nums.size();i++){r += nums[i];}//起始将mid设为0 int mid = 0;//ans来记录二分的答案,当答案满足记录下来继续二分 int ans = 0;//确定了二分的大致范围while(l<=r){//mid = (r+l)/2 下面这样写可以防止越界超过int的最大数值 mid = l+((r-l)>>1);//下面可以这样理解,返回值小于<=k,就是符合限制条件并且分的分数还比规定的小,那么一定有mid if( check(nums,mid) <= k){//mid都符合要求,右面的limit一定符合要求,所以去左面进行二分查找//先记录答案,然后去做左面看有没有最优解ans = mid;r = mid-1;}else{//不符合要求,去右面找 l = mid +1;}}return ans;}//可以说用到了贪心算法,就是没个部分都是最优解,这样分的份数最小 int check(vector<int>& nums, int limit){int sum = 0;int ret= 1; //代表最少分几份for(int i = 0 ;i<nums.size();i++){//如果数组中有值超过了限制,这个限制不成立if(nums[i] > limit) return INT_MAX;if(sum + nums[i] <= limit){//没有满 将数据吸纳进来sum += nums[i];}else{//当前sum结束了,现在sum的值为当前num[i]的值ret++;sum = nums[i];}}return ret;}
};

方法二:

        在前面划分左右区间时就将区间范围划分到最小,这样可以避免处理后面,数组中有大于限制情况。

class Solution {
public:int splitArray(vector<int>& nums, int k) {//二分答案 将最大部分的累加和一直二分,写一个函数(每组数据都限制在这个累加和的范围内时是否符合要求小于等于k个)判断//非负整数可以为0//在前面可以将区间缩小到最小然后可以避免后面细节的判断防止出错int l = 0;int r = 0;for(int i = 0; i<nums.size();i++){r += nums[i];//区间的左值因为是数组划分完后的最大的最小值,所以一定大于等于数组中最大元素的值,将左端点设置为数组中最大的元素l = max(l,nums[i]);}int mid = 0;int ans = 0;//确定了二分的大致范围while(l<=r){mid = l+((r-l)>>1);if( check(nums,mid) <= k){//mid都符合要求,右面的limit一定符合要求,所以去左面进行二分查找//先记录答案,然后去做左面看有没有最优解ans = mid;r = mid-1;}else{l = mid +1;}}return ans;}int check(vector<int>& nums, int limit){int sum = 0;int ret= 1; //代表最少分几份for(int i = 0 ;i<nums.size();i++){if(sum + nums[i] <= limit){//没有满 将数据吸纳进来sum += nums[i];}else{//当前sum结束了,现在sum的值为当前num[i]的值ret++;sum = nums[i];}}return ret;}
};

题目三:找出第K小的数对距离

题目链接:719. 找出第 K 小的数对距离 - 力扣(LeetCode)

题解:

1        题意数对距离就是两数之间的绝对值差值,题目要返回第k小的数对距离。

2        先看答案与给定条件之间的单调性关系,当两数的绝对值差值越大,那么这个K值也会越大,所以存在一定的单调性关系。

3        那么我们可以二分数对距离,根据题意找到最大最小的数对距离。

4         check函数我们可以传递mid位置的数对距离,然后返回mid位置为第几小的位置,与给定的k进行比较,直到二分结束。

class Solution {
public:int smallestDistancePair(vector<int>& nums, int k) {//因为要找数据之间差值最大的两个数,并且该题排序与不排序不会影响最终结果 sort(nums.begin(),nums.end());//由于上面进行了排序所以右边界就是最大值与最小值的差值 int r = nums[nums.size() -1] - nums[0];//左边界就是数组中最小的差值,也就是数组之间相邻的两个数据最小的差值int l =r;for(int i = 1;i<nums.size()-1;i++){l = min(r,nums[i]-nums[i-1]);} int ans = 0;int mid = 0;while(l<=r){mid = l+((r-l)>>1);//num为返回的第几小的元素,与k进行比较int num = check(nums,mid);if(num >= k){//符合要求,将mid记录,这是mid可能已经为最终答案,记录以备候选,继续二分看是否还有最优解 ans = mid;r = mid -1;}else{//mid不符合要求,缩小区间到mid的右面 l = mid +1;}}return ans;}//用来判断是不是与第k小的关系,也就是返回<=mid的数对数量int check(vector<int>& nums,int mid){//这道题应用到了滑动窗口的方法 int sum = 0;int r = -1, l = 0;for(l=0;l< nums.size();l++){//从0开始存不能等于nums.size(),如果r+1 - l 的差值小于等于传进来的差值,就r++向后走,否则就停止 while(r < l || ((r+1)<nums.size() && nums[r+1] - nums[l] <= mid)){r++;}//因为l要加了,先将区间内符合条件的数据记录个数,L++,也就是l走之前记录l位置处的符合条件的个数 sum += r-l;}return sum;}
};

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

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

相关文章

学习爬虫的第二天——分页爬取并存入表中

阅读提示&#xff1a;我现在还在尝试爬静态页面 一、分页爬取模式 以豆瓣Top250为例&#xff1a; 基础url:豆瓣电影 Top 250https://movie.douban.com/top250 分页参数:?start0&#xff08;第一页&#xff09;、?start25&#xff08;第二页&#xff09;等 每页显示25条数…

第 8 章:使用更好的库_《C++性能优化指南》_notes

使用更好的库 第八章核心知识点解析编译与测试建议总结优化原则重点内容&#xff1a;第一部分&#xff1a;多选题&#xff08;10题&#xff09;第二部分&#xff1a;设计题答案与解析多选题答案&#xff1a;设计题答案示例&#xff08;部分&#xff09;&#xff1a; 测试用例设…

RabbitMQ 学习整理1 - 基础使用

项目代码&#xff1a;RabbitMQDemo: 学习RabbitMQ的一些整理 基本概念 RabbitMQ是一种基于AMQP协议的消息队列实现框架RabbitMQ可以用于在系统与系统之间或者微服务节点之间&#xff0c;进行消息缓存&#xff0c;消息广播&#xff0c;消息分配以及限流消峰处理RabbitMQ-Serve…

React组件简介

组件 在 React 中&#xff0c;组件&#xff08;Component&#xff09; 是 UI 的基本构建块。可以把它理解为一个独立的、可复用的 UI 单元&#xff0c;类似于函数&#xff0c;它接受输入&#xff08;props&#xff09;&#xff0c;然后返回 React 元素来描述 UI。 组件的简单…

Kafka消息序列化深度革命:构建高性能、高安全的自定义编码体系

一、突破默认序列化的桎梏 1.1 原生序列化器的致命缺陷 Kafka默认提供的StringSerializer/ByteArraySerializer在复杂场景下暴露三大痛点&#xff1a; 类型安全黑洞&#xff1a;字节流缺乏元数据描述&#xff0c;消费端解析如履薄冰版本兼容困境&#xff1a;数据结构变更导致…

向量数据库与传统数据库的差异

向量数据库是一种专门设计用于高效存储、管理和检索**向量数据&#xff08;高维数值数组&#xff09;**的数据库系统。它针对非结构化数据&#xff08;如图像、文本、音频&#xff09;的特征进行优化&#xff0c;通过将数据转化为向量嵌入&#xff08;embeddings&#xff09;&a…

自动化框架的设计与实现

一、自动化测试框架 在大部分测试人员眼中只要沾上“框架”&#xff0c;就感觉非常神秘&#xff0c;非常遥远。大家之所以觉得复杂&#xff0c;是因为落地运用起来很复杂&#xff1b;每个公司&#xff0c;每个业务及产品线的业务流程都不一样&#xff0c;所以就导致了“自动化…

SpringBoot 3+ Lombok日志框架从logback改为Log4j2

r要将Spring Boot 3项目中的日志框架从Logback切换到Log4j2&#xff0c;并配置按日期滚动文件和控制台输出&#xff0c;请按照以下步骤操作&#xff1a; 步骤 1&#xff1a;排除Logback并添加Log4j2依赖 在pom.xml中修改依赖&#xff1a; <dependencies><!-- 排除默…

①、环境准备-主流技术(IPS/FW/主备-主主快速切换)

主流技术&(IPS/FW/主备-主主快速切换&#xff09; 一、RBM主备方案 RBM-FW-P 主配置内容介绍-注释 remote-backup group 含义&#xff1a;定义了一个远程备份组。这表明设备支持某种形式的远程备份功能&#xff0c;用于在设备之间同步配置或数据。data-channel interface …

量化交通拥堵

指数&#xff1a; 基于严重拥堵里程比的指数和基于出行时间比的指数。 评价指标是饱和度&#xff08;VC比&#xff09;&#xff0c;它表示交通量与通行能力的比值。 饱和度可分为道路饱和度和路口饱和度。道路饱和度还会进一步分级&#xff0c;有四档和六档之分。 城市道路和…

PDF与Markdown的量子纠缠:一场由VLM导演的文档界奇幻秀

缘起:当格式界的"泰坦尼克号"撞上"黑客帝国" 某个月黑风高的夜晚,在"二进制酒吧"的霓虹灯下: PDF(西装革履地晃着威士忌): “我的每一页都像瑞士手表般精密,连华尔街的秃鹫都为我倾倒!” Markdown(穿着带洞的拖鞋): “得了吧老古董!…

【neo4j数据导出并在其他电脑导入】

停止服务 neo4j stop 导出 neo4j-admin database dump neo4j --to-path"C:\Users\12901\Downloads\test folder" 导入 将 .dump 文件放在一个目录中 mkdir /root/dump-directory mv /root/neo4j.dump /root/dump-directory/ 使用包含 .dump 文件的目录路径作为 …

前端使用WPS WebOffice 做在线文档预览与编辑

先附上官网 WebOffice SDK 1、在下面这个地方找到jdk&#xff0c;然后下载 按照 2、只需要把jdk下载下来&#xff0c;放到项目中&#xff0c;然后引入到项目中就可以了&#xff0c;在wps 官网创建个应用&#xff0c;然后把appId放到代码中就可以了&#xff0c;等待后端把回调…

跨语言微服务架构(Java、Python)——“API中台”

文章目录 一、引言二、系统架构概述2.1 统一单点登录&#xff08;SSO&#xff09;与权限管理设计2.2 API中台与数据中台的融合2.3 跨语言适配器与 JWT 认证机制 三、技术细节与工具选型3.1 SSO 系统的选型与实现3.2 微服务架构与 API 中台的实现3.3 跨语言适配器实现与技术难点…

DeepSeek V3-0324升级:开启人机共创新纪元

一、技术平权&#xff1a;开源协议重构AI权力格局 DeepSeek V3选择MIT协议开源6850亿参数模型&#xff0c;本质上是一场针对技术垄断的“数字起义”。这一决策的深层影响在于&#xff1a; 商业逻辑的重构 闭源AI公司依赖API收费的商业模式面临根本性挑战。当顶级模型能力可通过…

QOpenGLWidget视频画面上绘制矩形框

一、QPainter绘制 在QOpenGLWidget中可以绘制,并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后,解锁资源,再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bind();//绘制视频数据// 解绑VAOg…

3.3 Taylor公式

1.定义 1.1 taylor公式 1.2 麦克劳林公式 1.3 推论 1.4 拉格朗日余项和皮亚诺型余项 2. 例题 3.几种特殊函数的麦克劳林展开

CEF 给交互函数, 添加控制台是否显示交互参数log开关

CEF 控制台添加一函数,枚举 注册的供前端使用的CPP交互函数有哪些 CEF 多进程模式时,注入函数,获得交互信息-CSDN博客 这两篇文章,介绍了注入函数,在控制台中显示 各自提供的交互函数信息。 有些场景下,我们还需要更详细的信息,比如想知道 彼此传递的参数, 如果每次调…

QTcpSocket多线程连接慢问题

20250325记录 环境&#xff1a;Qt5.14.2 64位 msvc编译 在多线程环境下&#xff0c;使用QTcpSocket实现客户端&#xff0c;发现在少部分电脑上&#xff0c;连接时间过长&#xff0c;定时器检查套接字状态时&#xff0c;发现连接处于QAbstractSocket::ConnectingState状态。 …

IntelliJ IDEA创建Maven工程

1、创建空工程 1&#xff09;创建 2&#xff09;配置JDK和Maven 2、创建Maven工程 3、Maven工程结构简介 1&#xff09;目录 pom.xml 2&#xff09;窗口 4、参考 08.IDEA配置本地Maven软件_哔哩哔哩_bilibili