题目描述
给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n 。
数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)的 总和(下标从 0 开始)。
你可以选用 nums1 中的 任意一个 元素来替换 nums1 中的 至多 一个元素,以 最小化 绝对差值和。
在替换数组 nums1 中最多一个元素 之后 ,返回最小绝对差值和。因为答案可能很大,所以需要对 10^9 + 7 取余 后返回。
基本思路
- 本题因为要排序,进行二分查找(即查找nums2数组对应于nums1数组里的下标)
- 二分里面涉及dis的比较,首先赋值为-1
- 利用f[i]=v[i]-v3[i] 实现争取到的额外的差值计算
源代码如下
class Solution {
public:
int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {
vector <int> v(nums1.size()); //所有的差值列表
int sum=0;
for(int i=0;i<nums1.size();i++)
v[i]=abs(nums2[i]-nums1[i]);
vector <int> v3(nums1.size()),v2(nums1);
sort(v2.begin(),v2.end());
//找到num2对应在num1差值最小的那个元素
int i=0;
for(auto &t:nums2){
int dis=-1;
int low=0,high=nums1.size()-1;
int m;
while(low<=high){
m=(low+high)/2;
if(dis==-1) dis=abs(t-v2[m]);
else if(dis>abs(t-v2[m])) dis=abs(t-v2[m]);
if(v2[m]>t)
high=m-1;
else
low=m+1;
}
v3[i]=dis;
i++;
}
vector <int> f(nums1.size()); //可以替换的优化的差值
int maxnum=0;
for(int i=0;i<nums1.size();i++){
if(v3[i]!=-1&&v[i]>v3[i]) //差值一样等于没替换
f[i]=v[i]-v3[i];
}
maxnum=*max_element(f.begin(),f.end());
sum-=maxnum;
for(auto &t:v){
sum+=t;
if(sum>pow(10,9)+7)
sum%=(int)(pow(10,9)+7);
}
return sum;
}
};