二分答案之最大化最小值

参考资料来源灵神在力扣所发的题单,仅供分享学习笔记和记录,无商业用途。

核心思路:本质上是求最大

应用场景:在满足条件的最小值区间内使最大化

检查函数:保证数据都要大于等于答案

补充:为什么需要满足大于等于答案的元素而不是等于答案的元素,因为二分会收敛至最优结果

模板:

    bool check() //检查条件int smallestDivisor(vector<int>& nums, int threshold) {while(l<r){mid=l+((r-l)>>1)+1;if(check(start,d,mid)) l=mid; //满足条件,增大区间尝试找到更好数据else r=mid-1;  //不满足条件,缩小区间积极找到合法答案}return l;

力扣题单练习(灵神题单中摘取题目)

3281. 范围内整数的最大得分

题意:

给定一个整数数组表示有n个区间[start[i], start[i] + d]。

要求在每个区间内选取一个数,然后这些数据进行两两组合进行绝对差计算,以最小绝对差为结果

要求怎样在区间内取数让结果最大化,也就是最小绝对差最大化

思路:

合理右边界:选取整数数组中最小值和最大值+d获得最大绝对差

检查函数:判断当前区间对每个区间各取的整数的绝对差是否都大于等于答案。

贪心策略:当区间左边界+答案,小于等于下一个区间右边界说明绝对差值大于等于答案,当前成立。

贪心补充:

因为是升序,所以满足了后一个区间,后面所有区间绝对差值只会越来越大,所以当前成立。

采用当前区间左边界是因为要让它尽可能落到合法区间,如果它都没有满足,当前区间内所有数据都不会满足。

反之说明当前答案不成立,因为至少有一组区间的绝对差小于答案。

class Solution {
public://检查函数:判断当前区间对每个区间各取的整数的绝对差是否都大于等于答案。//贪心策略:当区间左边界+答案,小于等于下一个区间右边界说明绝对差值大于等于答案,当前成立。//因为是升序,所以满足了后一个区间,后面所有区间绝对差值只会越来越大,所以当前成立。//采用当前区间左边界是因为要让它尽可能落到合法区间,如果它都没有满足,当前区间内所有数据都不会满足//反之说明当前答案不成立,因为至少有一组区间的绝对差小于答案。bool check(vector<int>& nums, int d, int ret){long long x = LLONG_MIN;for(long long k:nums){x=max(k,x+ret);if(x>k+d) return false;  //超出下一个区间右边界说明至少存在一组区间的绝对差小于答案,不满足}return true;}int maxPossibleScore(vector<int>& start, int d) {//题意:给定一个整数数组表示有n个区间[start[i], start[i] + d]。//要求在每个区间内选取一个数,然后这些数据进行两两组合进行绝对差计算,以最小绝对差为结果//要求怎样在区间内取数让结果最大化,也就是最小绝对差最大化//合理右边界:选取整数数组中最小值和最大值+d获得最大绝对差sort(start.begin(),start.end());int l=0,r=start[start.size()-1]-start[0]+d,mid;while(l<r){mid=l+((r-l)>>1)+1;if(check(start,d,mid)) l=mid;else r=mid-1;}return l;}
};

2517. 礼盒的最大甜蜜度

题意:

给定一个正整数数组,要求你选取k个元素,并求出任意两元素绝对差的最小值,要求最小值最大化

思路:

合理右边界:最大可能的差值是最大值减最小值

检查函数:选取排序后第一个元素,判断是否有k个满足大于等于答案的元素

贪心策略:如果最小值作为选取值都没有找到满足条件的k个元素,其他更不可能

class Solution {
public://检查函数:选取排序后第一个元素,判断是否有k个满足大于等于答案的元素//为什么需要满足大于等于答案的元素而不是等于答案的元素,因为二分会收敛至最优结果//贪心策略:如果最小值作为选取值都没有找到满足条件的k个元素,其他更不可能bool check(vector<int>& nums, int k, int ret){int cnt=1; //选取数据的数量int last=nums[0];  //当前选取元素for(int i=1;i<nums.size();i++){if(nums[i]-last>=ret){last=nums[i];cnt++;if(cnt==k) return true; //当满足条件的元素等于k个时,说明答案成立}}return false;}int maximumTastiness(vector<int>& price, int k) {//题意:给定一个正整数数组,要求你选取k个元素,并求出任意两元素绝对差的最小值,要求最小值最大化//合理右边界:最大可能的差值是最大值减最小值sort(price.begin(),price.end());int l=0,r=price.back()-price[0],mid;while(l<r){mid=l+((r-l)>>1)+1;if(check(price,k,mid)) l=mid;else r=mid-1;}return l;}
};

2812. 找出最安全路径

题意:

给定一个大小为 n x n 的二维矩阵 grid。

grid[r][c] = 1 ,则表示一个存在小偷的单元格。grid[r][c] = 0 ,则表示一个空单元格

你最开始位于单元格 (0, 0),可以上下左右移动。返回所有通向单元格 (n - 1, n - 1) 的路径中的 最大安全系数 。

安全系数 定义为:从路径中任一单元格到矩阵中任一小偷所在单元格的 最小 曼哈顿距离。

两个单元格 (a, b) 和 (x, y) 之间的 曼哈顿距离 等于 | a - x | + | b - y | 。

思路:

合理右边界:

安全系数定义为路径上任意点到最近小偷的最小曼哈顿距离。

对于一个n×n的矩阵,任意两点间的最大曼哈顿距离为2n-2(从左上角到右下角)。但由于小偷可能位于矩阵内部,实际的安全系数上限会更小。

在最坏情况下,小偷位于四个角落,安全系数最大为n-1,此时右边界设为n(即矩阵行长度)可以覆盖所有可能的安全系数。

检查函数:判断是否有一条到达终点且路径上的单元格到小偷单元格距离大于等于答案的路径

class Solution {
public:int d[4][2]={0,1,0,-1,-1,0,1,0};//检查函数:判断是否有一条到达终点且路径上的单元格到小偷单元格距离大于等于答案的路径bool check(vector<vector<int>>& dist, int k){if(dist[0][0]<k) return false;  vector<vector<bool>> vis(dist.size(),vector<bool>(dist[0].size(),false)); //去重queue<pair<int,int>> q;vis[0][0]=true;q.push({0,0});while(!q.empty()){  //广搜:在所有到达终点的路径中找到一条满足条件的路径auto [x,y]=q.front();q.pop();for(int m=0;m<4;m++){int i=x+d[m][0];int j=y+d[m][1];if( i<0 || i>=dist.size() || j<0 || j>=dist[0].size() || dist[i][j]<k || vis[i][j]) continue;if(i==dist.size()-1 && j==dist[0].size()-1) return true;vis[i][j]=true;q.push({i,j});}}return false;}int maximumSafenessFactor(vector<vector<int>>& grid) {//题意:给定一个大小为 n x n 的二维矩阵 grid。//grid[r][c] = 1 ,则表示一个存在小偷的单元格。grid[r][c] = 0 ,则表示一个空单元格//你最开始位于单元格 (0, 0),可以上下左右移动。返回所有通向单元格 (n - 1, n - 1) 的路径中的 最大安全系数 。//安全系数 定义为:从路径中任一单元格到矩阵中任一小偷所在单元格的 最小 曼哈顿距离。//两个单元格 (a, b) 和 (x, y) 之间的 曼哈顿距离 等于 | a - x | + | b - y | 。//合理右边界:安全系数定义为路径上任意点到最近小偷的最小曼哈顿距离。//对于一个n×n的矩阵,任意两点间的最大曼哈顿距离为2n-2(从左上角到右下角)。但由于小偷可能位于矩阵内部,实际的安全系数上限会更小。//在最坏情况下,小偷位于四个角落,安全系数最大为n-1,此时右边界设为n(即矩阵行长度)可以覆盖所有可能的安全系数。vector<vector<int>> dist(grid.size(),vector<int>(grid[0].size(),-1));queue<pair<int,int>> q;//记录小偷所在单元格的位置,并重置距离for(int i=0;i<grid.size();i++){for(int j=0;j<grid[0].size();j++){if(grid[i][j]==1){q.push({i,j});dist[i][j]=0;}}}//计算每个普通单元格距离小偷单元格的最小距离while(!q.empty()){auto [x,y]=q.front();q.pop();for(int m=0;m<4;m++){int i=x+d[m][0];int j=y+d[m][1];if(i<0 || i>=dist.size() || j<0 || j>=dist[0].size()) continue;if(dist[i][j]==-1){dist[i][j]=dist[x][y]+1;q.push({i,j});}}}int l=0,r=grid[0].size(),mid;while(l<r){mid=l+((r-l)>>1)+1;if(check(dist,mid)) l=mid;else r=mid-1;}return l;}
};

2528. 最大化城市的最小电量

题意:

给定一个整数数组表示每个城市的供电站数量和影响范围。可以额外添加k座供电站

每个供电站可以在一定范围内给所有城市提供电力。要求城市最小电量最大化

思路:

合理右边界:城市最小电量+k为极限边界

检查函数:判断添加k个供电站是否能使数组元素都>=答案

贪心策略:如果当前城市电量小于答案,需要在当前位置+r,也就是右边界添加。这样能保证尽可能的辐射更多的城市

滑动窗口:维护区间内添加的发电站的总电量

class Solution {
public://检查函数:判断添加k个供电站是否能使数组元素都>=答案//贪心策略:如果当前城市电量小于答案,需要在当前位置+r,也就是右边界添加。这样能保证尽可能的辐射更多的城市//滑动窗口:维护区间内添加的发电站的总电量bool check(vector<long long>& nums, int r, int k, long long m){long long cnt=k;  //格外发电站建立数量long long buff=0; //当前位置+r区间内格外建造的发电站的总电量int n=nums.size();vector<long long> ans(n,0);for(int i=0;i<n;i++){if(i-r-1>=0) buff-=ans[i-r-1];  //维护一个定长滑窗long long total=buff+nums[i];if(total>=m) continue;long long need=m-total;if(cnt<need) return false;ans[min(i+r,n-1)]+=need;buff+=need;cnt-=need;}return true;}long long maxPower(vector<int>& stations, int r, int k) {//题意:给定一个整数数组表示每个城市的供电站数量和影响范围。可以额外添加k座供电站//每个供电站可以在一定范围内给所有城市提供电力。要求城市最小电量最大化//合理右边界:城市最小电量+k为极限边界int n=stations.size();vector<long long> buff(n+1,0);for(int i=0;i<n;i++) buff[i+1]=buff[i]+stations[i]; //计算前缀和//根据每个城市的供电站数量和影响范围获取城市的电量vector<long long> ans(n);long long min_num=LLONG_MAX;for(int i=0;i<n;i++){int left=max(i-r,0);int right=min(i+r,n-1);ans[i]=buff[right+1]-buff[left];min_num=min(min_num,ans[i]);}//二分答案long long head=0,tail=min_num+k,mid;while(head<tail){mid=head+((tail-head)>>1)+1;if(check(ans,r,k,mid)) head=mid;else tail=mid-1;}return head;}
};

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

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

相关文章

OCR 赋能档案数字化:让沉睡的档案 “活” 起来

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;企业产品档案包含设计图纸、检测报告、生产记录等&#xff0c;传统数字化仅靠扫描存档&#xff0c;后续检索需人工逐份翻阅&#xff0c;效率极低。​OCR 产品档案解决方案直击痛点&#xff1a;通过智能识别技…

力扣118.杨辉三角

思路1.新建一个vector的vector2.先把空间开出来&#xff0c;然后再把里面的值给一个个修改开空间的手段&#xff1a;new、构造函数、reserve、resize因为我们之后要修改里面的数据&#xff0c;这就意味着我们需要去读取这个数据并修改&#xff0c;如果用reserve的话&#xff0c…

Python 网络爬虫 —— 提交信息到网页

一、模块核心逻辑“提交信息到网页” 是网络交互关键环节&#xff0c;借助 requests 库的 post() 函数&#xff0c;能模拟浏览器向网页发数据&#xff08;如表单、文件 &#xff09;&#xff0c;实现信息上传&#xff0c;让我们能与网页背后的服务器 “沟通”&#xff0c;像改密…

SpringMVC4

一、SpringMVC 注解与项目开发流程1.1注解的生命周期- Target、Retention 等元注解&#xff1a;- Target(ElementType.TYPE) &#xff1a;说明这个注解只能用在类、接口上。- Retention(RetentionPolicy.RUNTIME) &#xff1a;说明注解在运行时保留&#xff0c;能通过反射获取…

数据结构排序算法总结(C语言实现)

以下是常见排序算法的总结及C语言实现&#xff0c;包含时间复杂度、空间复杂度和稳定性分析&#xff1a;1. 冒泡排序 (Bubble Sort)思想&#xff1a;重复比较相邻元素&#xff0c;将较大元素向后移动。 时间复杂度&#xff1a;O(n)&#xff08;最好O(n)&#xff0c;最坏O(n)) 空…

嵌入式学习-PyTorch(2)-day19

很久没有学了&#xff0c;期间打点滴打了一个多星期&#xff0c;太累了&#xff0c;再加上学了一下Python语法基础&#xff0c;再终于开始重新学习pytorchtensorboard 的使用import torch from torch.utils.tensorboard import SummaryWriter writer SummaryWriter("logs…

Prompt Engineering 快速入门+实战案例

资料来源&#xff1a;火山引擎-开发者社区 引言 什么是 prompt A prompt is an input to a Generative AI model, that is used to guide its output. Prompt engineering is the process of writing effective instructions for a model, such that it consistently generat…

「源力觉醒 创作者计划」_文心开源模型(ERNIE-4.5-VL-28B-A3B-PT)使用心得

文章目录背景操作流程开源模型选择算力服务器平台开通部署一个算力服务器登录GPU算力服务器进行模型的部署FastDeploy 快速部署服务安装paddlepaddle-gpu1. 降级冲突的库版本安装fastdeploy直接部署模型&#xff08;此处大约花费15分钟时间&#xff09;放行服务端口供公网访问最…

P10719 [GESP202406 五级] 黑白格

题目传送门 前言&#xff1a;不是这样例有点过分了哈&#xff1a; 这是我没考虑到无解的情况的得分&#xff1a; 这是我考虑了的得分&#xff1a; 总而言之&#xff0c;就是一个Subtask 你没考虑无解的情况&#xff08;除了Subtask #0&#xff09;,就会WA一大片,然后这个Subt…

AWS RDS PostgreSQL可观测性最佳实践

AWS RDS PostgreSQL 介绍AWS RDS PostgreSQL 是亚马逊云服务&#xff08;AWS&#xff09;提供的托管型 PostgreSQL 数据库服务。托管服务&#xff1a;AWS 管理数据库的底层基础设施&#xff0c;包括硬件、操作系统、数据库引擎等&#xff0c;用户无需自行维护。高性能&#xff…

C++——set,map的模拟实现

文章目录前言红黑树的改变set的模拟实现基本框架迭代器插入源码map模拟实现基础框架迭代器插入赋值重载源码测试代码前言 set&#xff0c;map底层使用红黑树这种平衡二叉搜索树来组织元素 &#xff0c;这使得set, map能够提供对数时间复杂度的查找、插入和删除操作。 下面都是基…

LabVIEW液压机智能监控

​基于LabVIEW平台&#xff0c;结合西门子、研华等硬件&#xff0c;构建液压机实时监控系统。通过 OPC 通信技术实现上位机与 PLC 的数据交互&#xff0c;解决传统监控系统数据采集滞后、存储有限、参数调控不便等问题&#xff0c;可精准采集冲压过程中的位置、速度、压力等参数…

15. 什么是 xss 攻击?怎么防护

总结 跨站脚本攻击&#xff0c;注入恶意脚本敏感字符转义&#xff1a;“<”,“/”前端可以抓包篡改主要后台处理&#xff0c;转义什么是 XSS 攻击&#xff1f;怎么防护 概述 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的 Web 安全…

更换docker工作目录

使用环境 由于默认系统盘比较小docker镜像很容易就占满&#xff0c;需要挂载新的磁盘修改docker的默认工作目录 环境&#xff1a;centos7 docker默认工作目录: /var/lib/docker/ 新的工作目录&#xff1a;/home/docker-data【自己手动创建&#xff0c;一般挂在新加的磁盘下面】…

算法学习笔记:26.二叉搜索树(生日限定版)——从原理到实战,涵盖 LeetCode 与考研 408 例题

二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种特殊的二叉树&#xff0c;因其高效的查找、插入和删除操作&#xff0c;成为计算机科学中最重要的数据结构之一。BST 的核心特性是 “左小右大”&#xff0c;这一特性使其在数据检索、排序和索引…

共生型企业:驾驭AI自动化(事+AI)与人类增强(人+AI)的双重前沿

目录 引言&#xff1a;人工智能的双重前沿 第一部分&#xff1a;自动化范式&#xff08;事AI&#xff09;——重新定义卓越运营 第一章&#xff1a;智能自动化的机制 第二章&#xff1a;自动化驱动的行业转型 第三章&#xff1a;自动化的经济演算 第二部分&#xff1a;协…

TypeScript的export用法

在 TypeScript 中&#xff0c;export 用于将模块中的变量、函数、类、类型等暴露给外部使用。export 语法允许将模块化的代码分割并在其他文件中导入。 1. 命名导出&#xff08;Named Export&#xff09; 命名导出是 TypeScript 中最常见的一种导出方式&#xff0c;它允许你导出…

数据结构-2(链表)

一、思维导图二、链表的反转def reverse(self):"""思路&#xff1a;1、设置previous_node、current、next_node三个变量,目标是将current和previous_node逐步向后循环并逐步进行反转,知道所有元素都被反转2、但唯一的问题是&#xff1a;一旦current.next反转为向…

ros2 标定相机

一个终端执行&#xff1a; ros2 run image_tools cam2image --ros-args -p width:640 -p height:480 -p frequency:30.0 -p device_id:-1 -r /image:/camera/image_raw另一个终端执行&#xff1a;8x6 是格子角点数量&#xff0c;0.028是格子尺寸 ros2 run camera_calibration …

IsaacLab学习记录(二)

二、导入并训练自己的机器人1、urdf等其他格式转usd&#xff08;工具在./scrips/tools/&#xff09;​​​维度​​​​URDF (Unified Robot Description Format)​​​​USD (Universal Scene Description)​​​​定位​​机器人模型描述标准&#xff08;仅描述单机器人&…