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

news2024/12/25 9:20:22

本文涉及的基础知识点

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++**实现。

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

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

相关文章

Java获取小程序码示例(三种小程序码)

首先我们可以看到官方文档上是有三种码的 获取小程序码 这里特别要注意的是第一种和第三种是有数量限制的&#xff0c;所以大家生成的时候记得保存&#xff0c;也不要一直瞎生成 还有一点要注意的是第一种和第二种是太阳码 第三种是方形码 好了直接上代码 这里要注意&#xff…

南京网站设计手机用的网站

近年来&#xff0c;随着移动互联网的快速发展&#xff0c;越来越多的用户通过手机浏览网页&#xff0c;这使得网站设计逐渐向移动端倾斜。在南京&#xff0c;网站设计特别注重适配手机端&#xff0c;这不仅是用户体验的提升&#xff0c;也是市场竞争的需要。一个响应式的网站能…

深度评测热门翻译工具,携手你的翻译得力助手

随着互联网技术的飞速发展&#xff0c;全球化交流日益频繁&#xff0c;跨语言沟通的需求也随之激增。对于外语水平有限的朋友来说&#xff0c;翻译器是一个必不可少的工具。今天我就分享几款我用的翻译器吧。 1.福晰在线翻译 链接直达>>https://fanyi.pdf365.cn/doc …

Java语言的Netty框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码

介绍 云快充协议云快充1.5协议云快充1.6云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩协议云快充源码 软件架构 1、提供云快充底层桩直连协议&#xff0c;版本为云快充1.5&#xff0c;对于没有对接过充电桩系统的开发者尤为合适&#xff1b; 2、包含&…

WebAPI (一)DOM树、DOM对象,操作元素样式(style className,classList)。表单元素属性。自定义属性。间歇函数定时器

文章目录 Web API基本认知一、 变量声明二、 DOM1. DOM 树2. DOM对象3. 获取DOM对象(1)、选择匹配的第一个元素(2)、选择匹配多个元素 三、 操作元素1. 操作元素内容2. 操作元素属性(1)、常用属性&#xff08;href之类的&#xff09;(2)、通过style属性操作CSS(3)、通过类名(cl…

Vivado 约束

步骤5&#xff1a;保存约束 约束管理是设计流程的重要一步&#xff0c;Vivado设计套件 为您提供了在现有约束文件中添加新约束、覆盖的灵活性 现有约束&#xff0c;或创建新的约束文件以跟踪设计更改或完成 缺少约束。 您为设计创建了一些定时异常&#xff0c;但这些异常仅存在…

​​NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002

继续,执行pom.xml引入依赖以后,发现以下几种报错: 可以看到在下载aws-java-sdk-bundle 1.12.710版本的时候报错了 可以看到日志信息,就是在阿里云上下载的,因为阿里云上缺少这个jar包 aws-java-sdk-bundle-1.12.710.jar 这个jar包,我还特意去阿里云上查询了一下 https://deve…

从零到一:Java三层架构下的图书馆管理系统开发指南

引言 使用JavaSE相关知识完成一个以三层架构为设计规范的图书管理系统&#xff0c;不包括前端页面&#xff08;使用main方法Scanner()模拟用户输入&#xff09;&#xff0c;目的是为了基于一个项目快速了解三层架构的项目设计规范的实践。 开发流程 确认需求导入相关的jar包和…

jmeter 梯度测试 如何查看TPS、RT指标

TPS 服务器处理请求总数/花费的总时间 149371 &#xff08;请求量&#xff09; 113&#xff08;1分53秒&#xff09;1321/秒 跟汇总报告的吞吐量差不多&#xff0c;可以认为吞吐量TPS 平均值&#xff0c;中位数&#xff0c;最大值&#xff0c;最小值的单位都是毫秒ms 下载插…

用Git把本地仓库上传到远程仓库

用Git把本地仓库上传到远程仓库 GitHub创建远程仓库 在创建新仓库界面里输入你的仓库名后点击Create repository就好了。 创建本地项目 当你已经有一个项目后在命令行输入如下指令即可 git init git commit -m "first commit" git branch -M main git remote a…

寄存器映射及地址计算(STM32F407)

上篇文章介绍了存储器映射&#xff08;存储器映射&#xff08;STM32F407&#xff09;-CSDN博客&#xff09;&#xff0c;本文介绍寄存器映射的基本概念。 1、寄存器映射简介 寄存器是一类特殊的存储器&#xff0c;它的每个位都有特定的功能&#xff0c;可以实现对外设/功能的…

ubuntu16.04下qt5.7.1添加对openssl的支持

文章目录 前言一、编译安装openssl二、编译qt5.7.1三、配置qtcreator开发环境四、demo 前言 最近工作中要求客户端和服务端通过ssl加密通信,其中客户端是qt编程,服务端是linux编程.我的开发环境是ubuntu16.04;运行环境是debian9.13,是基于gnu的linux操作系统,64位arm架构. 一…

【数据库】|子查询

子查询 什么叫子查询&#xff1f;如何实现子查询&#xff1f; 定义&#xff1a;什么叫子查询&#xff0c;也就是先执行子查询&#xff0c;后执行父查询 ❓✅面试题&#xff1a;如何实现替换&#xff0c;执行顺序&#xff1f; 1、使用子查询&#xff0c;因为子查询会先执行子…

大语言模型LLM权重4bit向量量化(Vector Quantization)/查找表量化基本原理

参考 https://apple.github.io/coremltools/docs-guides/source/opt-palettization-overview.html https://apple.github.io/coremltools/docs-guides/source/opt-palettization-algos.html Apple Intelligence Foundation Language Models 苹果向量量化&#xff1a; DKM:…

深度学习基础--卷积的变种

随着卷积同经网络在各种问题中的广泛应用&#xff0c;卷积层也逐渐衍生出了许多变种&#xff0c;比较有代表性的有&#xff1a; 分组卷积( Group Convolution )、转置卷积 (Transposed Convolution) 、空洞卷积( Dilated/Atrous Convolution )、可变形卷积( Deformable Convolu…

协程的原理与实现:GMP源码走读

在计算机科学领域&#xff0c;尤其是在现代软件开发中&#xff0c;高并发处理能力是衡量技术架构性能的关键指标之一。Go语言&#xff0c;以其简洁的语法和内置的协程支持&#xff0c;为开发者提供了一套高效且易于使用的并发编程模型。本文深入剖析了Go语言协程的原理与其实现…

erlang学习:用ETS和DETS存储数据3,保存元组到磁盘

学习内容 ETS表把元组保存在内存里&#xff0c;而DETS提供了把Erlang元组保存到磁盘上的方法。DETS的最大文件大小是2GB。DETS文件必须先打开才能使用&#xff0c;用完后还应该正确关闭。如果没有正确关闭&#xff0c;它们就会在下次打开时自动进行修复。因为修复可能会花很长…

软件测试学习笔记丨Pytest的使用

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22158 1. 简介 pytest是一个成熟的全功能python测试框架测试用例的skip和xfail&#xff0c;自动失败重试等处理能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/ap…

路由器的固定ip地址是啥意思?固定ip地址有什么好处

‌在当今数字化时代&#xff0c;‌路由器作为连接互联网的重要设备&#xff0c;‌扮演着举足轻重的角色。‌其中&#xff0c;‌路由器的固定IP地址是一个常被提及但可能让人困惑的概念。‌下面跟着虎观代理小二一起将深入探讨路由器的固定IP地址的含义&#xff0c;‌揭示其背后…

元学习之如何学习

首先第一个步骤&#xff08;如图1所示&#xff09;是我们的学习算法里要有一些要被学的东西&#xff0c;就像在 机器学习里面神经元的权重和偏置是要被学出来的一样。在元学习里面&#xff0c;我们通常会考虑要 让机器自己学习网络的架构&#xff0c;让机器自己学习初始化的参数…