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

【C++二分查找】1818. 绝对差值和

本文涉及的基础知识点

C++二分查找

LeetCode1818. 绝对差值和

给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n 。
数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)的 总和(下标从 0 开始)。
你可以选用 nums1 中的 任意一个 元素来替换 nums1 中的 至多 一个元素,以 最小化 绝对差值和。
在替换数组 nums1 中最多一个元素 之后 ,返回最小绝对差值和。因为答案可能很大,所以需要对 109 + 7 取余 后返回。
|x| 定义为:
如果 x >= 0 ,值为 x ,或者
如果 x <= 0 ,值为 -x
示例 1:
输入:nums1 = [1,7,5], nums2 = [2,3,5]
输出:3
解释:有两种可能的最优方案:

  • 将第二个元素替换为第一个元素:[1,7,5] => [1,1,5] ,或者
  • 将第二个元素替换为第三个元素:[1,7,5] => [1,5,5]
    两种方案的绝对差值和都是 |1-2| + (|1-3| 或者 |5-3|) + |5-5| = 3
    示例 2:
    输入:nums1 = [2,4,6,8,10], nums2 = [2,4,6,8,10]
    输出:0
    解释:nums1 和 nums2 相等,所以不用替换元素。绝对差值和为 0
    示例 3:
    输入:nums1 = [1,10,4,4,2,7], nums2 = [9,3,5,1,7,4]
    输出:20
    解释:将第一个元素替换为第二个元素:[1,10,4,4,2,7] => [10,10,4,4,2,7]
    绝对差值和为 |10-9| + |10-3| + |4-5| + |4-1| + |2-7| + |7-4| = 20
    提示:
    n == nums1.length
    n == nums2.length
    1 <= n <= 105
    1 <= nums1[i], nums2[i] <= 105

C++二分查找

枚举nums1[]被更换,显然更换成和nums2[i]的最接近的nums1[j],j可以为i,也就是不更换。
有序容器中最近的it = lower_bound(…)
it 和(–it)之一。

代码

核心代码

class Solution {public:int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {long long sum = 0;const int N = nums1.size();for (int i = 0; i < N; i++) {sum += abs(nums1[i] - nums2[i]);}auto tmp = nums1;sort(tmp.begin(), tmp.end());int iChange = 0;for (int i = 0; i < N; i++) {const auto iChangValue = Near(tmp.begin(), tmp.end(), nums2[i], 0);iChange = min(iChange, abs(iChangValue - nums2[i]) - abs(nums1[i] - nums2[i]));}return (sum + iChange)%((int)1e9+7);}template<class Ptr,class T>T Near(Ptr begin, Ptr end, const T& val,const T valDefault) {auto it = lower_bound(begin, end, val);if ((end == it) && (begin == it)) { return valDefault; }if (end == it) {return *(--it);	}if (begin == it) { return *it; }auto pre = prev(it);return abs(*it - val) < abs(*pre - val) ? *it : *pre;}};

单元测试

vector<int> nums1, nums2;TEST_METHOD(TestMethod11){nums1 = { 1, 7, 5 }, nums2 = { 2, 3, 5 };auto res = Solution().minAbsoluteSumDiff(nums1, nums2);AssertEx(3, res);}TEST_METHOD(TestMethod12){nums1 = { 2,4,6,8,10 }, nums2 = { 2,4,6,8,10 };auto res = Solution().minAbsoluteSumDiff(nums1, nums2);AssertEx(0, res);}TEST_METHOD(TestMethod13){nums1 = { 1,10,4,4,2,7 }, nums2 = { 9,3,5,1,7,4 };auto res = Solution().minAbsoluteSumDiff(nums1, nums2);AssertEx(20, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java并发编程实战 06 | 为什么不建议使用线程优先级?
  • 企业级Ansible自动化运维项目案例:实战与技巧
  • Spring MVC: 构建Web应用的强大框架
  • 好用的 Markdown 编辑器组件
  • Python和MATLAB(Java)及Arduino和Raspberry Pi(树莓派)点扩展函数导图
  • Laravel安全应用模块示例教程
  • 【视频讲解】Python贝叶斯卷积神经网络分类胸部X光图像数据集实例
  • 仿华为车机UI--图标从Workspace拖动到Hotseat同时保留图标在原来位置
  • 从监控到智能:EasyCVR视频汇聚平台助力加油站安全监管升级转型
  • 黑神话:游戏的诞生
  • 桥接模式bridge
  • leetcode :746使用最小花费爬楼梯
  • 微软云技术深度解析与实战案例
  • 算法打卡——田忌赛马问题
  • (pycharm)安装python库函数Matplotlib步骤
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 08.Android之View事件问题
  • Create React App 使用
  •  D - 粉碎叛乱F - 其他起义
  • echarts花样作死的坑
  • Effective Java 笔记(一)
  • egg(89)--egg之redis的发布和订阅
  • es的写入过程
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Linux gpio口使用方法
  • spring security oauth2 password授权模式
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 技术发展面试
  • 配置 PM2 实现代码自动发布
  • 让你的分享飞起来——极光推出社会化分享组件
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 一天一个设计模式之JS实现——适配器模式
  • ionic异常记录
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #每天一道面试题# 什么是MySQL的回表查询
  • (12)Hive调优——count distinct去重优化
  • (2.2w字)前端单元测试之Jest详解篇
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (回溯) LeetCode 77. 组合
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (十一)c52学习之旅-动态数码管
  • (转)Linux整合apache和tomcat构建Web服务器
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET DataGridView数据绑定说明
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [2010-8-30]
  • [acwing周赛复盘] 第 69 场周赛20220917