265.数组距离最小化
问题描述
给定两个长度为 n 的整数数组 a 和 b,你可以对第一个数组 a 中的每个元素执行以下操作至多一次:
- 将元素变为其相反数(即将 x 变为 -x)
你的目标是通过合理的操作,使得两个数组之间的"绝对值距离"最小。
两个数组的"绝对值距离"定义为:对于数组中每个对应位置的元素,计算它们绝对值之差的绝对值,然后将所有差值相加。
用数学公式表示为:
用数学公式表示为:distance=∑∣abs(ai)−abs(bi)∣distance = \sum|abs(a_i) - abs(b_i)|,其中 0 ≤ i < n。
请返回可以得到的最小距离。
输入
n:数组的长度。a:第一个数组。b:第二个数组。
约束条件
- 1 ≤ n ≤ 10^5
- -10^9 ≤ a[i], b[i] ≤ 10^9
返回
返回 a 和 b 两个数组之间的可能的最小距离值。
示例
样例 1
输入:n = 3, a = [-1, 2, 3], b = [-3, 2, -1]
输出:4
解释:
将 a[2] = 3 变为 -3
变化后 a = [-1, 2, -3]
|(-1) - (-3)| = 2
|2 - 2| = 0
|(-3) - (-1)| = 2
此时有最小距离 2 + 0 + 2 = 4
样例 2
输入:n = 4, a = [-1, 2, 3, 4], b = [1, -2, 5, -4]
输出:2
样例 3
输入:n = 2, a = [100, -50], b = [-50, 100]
输出:100
本题所涉及到的相关库
<iostream>:用于输入输出流,如 cout。
<vector>:提供了动态数组容器 vector,可以存储任意类型的元素。
<algorithm>:在c++中这个库所体现的是相关库的使用和操作,例如 min 函数,用来找出两个值中的最小值,同时还有sort函数,用来对于数组内部的内容进行排序(在函数值为int类型的时候进行排序)
<cmath>:提供了数学相关的函数,在本道题中主要是使用了 abs函数来求某一个数值进行计算之后的绝对值。
解题思路与条件分析
那么我们针对于题目所书写的内容,有以下的条件我们是可以知晓的:
1、对于取反我们只能对于第一个数组a进行取反
2、每一个元素最多只能进行一次取反
3、所想得到的结果是进行取反之后的和的最小值
那么在对于题目进行分析之后,我们便可以使用下面的思路进行解题
1、采取循环的操作,每次只针对一个元素做出取反的操作
2、随后再进行比对,如果所取反的元素的总和小于未取反的元素的和,那么便将相关的值加入到对应的元素中去
3、如果取反后的值不符合题目的条件,那么就只加入未进行取反操作的值。
4、最后再将循环进行设定,那么只需要跑完一遍循环,即可得出相应的结论
实现难点分析
1、关于绝对值的计算:
在c++的函数库中,在cmath库中,存在abs函数,可以将计算所得出的结果进行去绝对值的操作
2、关于取最小值
在c++的常见算法库algorithm中有一个min函数,这个函数能快速的将所传输到函数的值取出其最小值并予以进行返回,而在函数的值进行返回之后,我们便可以得出对应的结果,从而进行返回。
在对于前面所使用的知识点进行完整的阐述的之后,我们便可以写出对应的代码如下
代码的实现
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath> // For std::abs
using namespace std;
int solution(int n, vector<int>& a, vector<int>& b) {
int minDistance = 0;
for (int i = 0; i < n; ++i) {
// 计算不取反 a[i] 时的距离
int dist1 = abs(abs(a[i]) - abs(b[i]));
// 计算取反 a[i] 时的距离
int dist2 = abs(abs(-a[i]) - abs(b[i]));
// 选择较小的距离
minDistance += min(dist1, dist2);
}
return minDistance;
}
int main() {
vector<int> a1 = {-1, 2, 3};
vector<int> b1 = {-3, 2, -1};
cout << (solution(3, a1, b1) == 4) << endl; // 输出 1 表示正确
vector<int> a2 = {-1, 2, 3, 4};
vector<int> b2 = {1, -2, 5, -4};
cout << (solution(4, a2, b2) == 2) << endl; // 输出 1 表示正确
vector<int> a3 = {100, -50};
vector<int> b3 = {-50, 100};
cout << (solution(2, a3, b3) == 100) << endl; // 输出 1 表示正确
return 0;
}