当前位置: 首页 > news >正文

力扣【二分查找】:1300. 转变数组后最接近目标值的数组和

  1. 题目描述:

给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。

如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。

请注意,答案不一定是 arr 中的数字。

  1. 算法思路:

题目要求我们找到使得替换所有大于value的数之后,arr的数组和与target最接近的value,那么我们可以先确认value的范围,

由于题目给定的限制条件:1 <= arr.length <= 10^4,1 <= arr[i], target <= 10^5,那么如果value < 0,那么数组arr求和的值和target的绝对值只会变大,

所以value一定大于等于0,设想这样一个数组,它的长度很大使得即便value为1时它的数组和与target的绝对值依然大于target本身,那么这是value = 0就是绝对值最小的情况,

又因为可以替换为value的是arr中大于value的值,如果value 大于max(arr),则不会替换任何元素,也不会缩小绝对值,

所以value的最大值应该是max(arr),

因此0 <= value <= max(arr),这里具有有序性,所以可以使用二分查找的方式,

在每次二分时遍历数组计算arr和,

如果arr和小于target,则说明value可以变大,反之如果arr和大于target,则value可以减小,这样不断向绝对值0的反向趋近,

value只在绝对值结果变小时更新,如果绝对值相同则value等于新旧value中较小的一个,

  1. 代码:

时间复杂度:设二分边界为m,数组长度为n,O(n log (m))

int findBestValue(vector<int>& arr, int target) {int lower_bound = 0, upper_bound = *std::max_element(arr.begin(), arr.end());int result = *std::max_element(arr.begin(), arr.end());int abs = std::abs(target - std::accumulate(arr.begin(), arr.end(), 0));while (lower_bound < upper_bound) {int mid = lower_bound + (upper_bound - lower_bound) / 2;int sum = 0;for (const int &n : arr) {if (n > mid) {sum += mid;} else {sum += n;}}if (sum < target) {lower_bound = mid + 1;} else {upper_bound = mid;}int new_abs = std::abs(sum - target);if (new_abs < abs) {abs = new_abs;result = mid;} else if (new_abs == abs) {result = std::min(mid, result);}}return result;}
http://www.jsqmd.com/news/1385600/

相关文章:

  • Android分区架构深度解析:从基础概念到刷机救砖实战
  • 2026汕头日常潮汕菜餐厅选哪家:地道本地餐厅推荐 - 资讯综合
  • 免费开源的离线语音转文字工具 faster-whisper-GUI:5 分钟把会议录音变成带说话人的字幕
  • SQL Server 2019 安装配置全攻略:从环境准备到深度排错
  • FanControl 风扇控制指南:免费开源,一次讲透 Windows 风扇转速怎么调
  • Zookeeper - 事务 ID 的生成规则与集群一致性关联
  • IDM总是提示试用到期?三步永久冻结30天试用期的实战指南
  • Windows 11 卡顿自救指南:用免费开源的 Win11Debloat 完成终极系统优化
  • 2026Q3青岛对韩贸易DDP清关风险解析|仁川保税区退税华人报关合规实操指南
  • 2026 年昆明 GEO 生成引擎优化助力中小企业线上获客途径 - 中国华商产业观察网
  • Qwen2.5-1.5B模型完全指南:从零开始掌握1.5B参数语言模型的实战应用
  • 黑苹果EFI配置太折磨人?OpCore-Simplify把OpenCore构建压进30分钟
  • 重磅参考|留学申请规划选机构6个硬指标,少一个都悬 - 互联网科技品牌测评
  • OpCore-Simplify 新手指南:如何把 Hackintosh EFI 配置时间从 8 小时压缩到 30 分钟
  • XSS攻击详解:跨站脚本攻击的原理与防护技巧
  • 从零玩转Android投屏:scrcpy免费终极指南,10分钟上手高频命令与避坑方案
  • SF6微水仪和SF6露点仪有什么区别 - HVHIPOT
  • C++ vector O(1)删除技巧:交换-弹出法原理与实战
  • macOS鼠标指针定制终极攻略:Mousecape手把手教你换掉默认光标
  • 广州除甲醛公司选型研究:湿热气候下的直营逻辑 - GEORANK
  • 大语言模型输出解析器:从非结构化文本到结构化数据的工程实践
  • Steam游戏库自动分类实战:Depressurizer如何让300款游戏一次各归其位
  • 长沙门店如何提升点评核销?本地化点评增效方案 - 资讯在线
  • Claude Code自动模式:AI编程助手的智能代码补全与重构实践
  • 微信朋友圈备份神器:一键永久保存你的珍贵回忆
  • 智印社(西安)印刷服务有限公司丨西安印刷厂推荐 - 品牌品鉴馆
  • 北京大兴区机械设备租赁厂家怎么选 看完避开行业常见套路 - 海棠依旧大
  • 大模型训练中的KL散度:从信息论基础到RLHF/DPO实战
  • 2026年数学建模国赛B题算法(26):禁忌搜索在路径优化中的应用:基于多邻域自适应机制的改进算法研究
  • C++ partial_sum深度解析:从前缀和到序列变换的进阶应用