https://leetcode-cn.com/problems/minimum-absolute-sum-difference/
思路:首先计算
s
u
m
=
∑
i
=
0
n
∣
a
i
−
b
i
∣
sum=\sum_{i=0}^{n}|a_i-b_i|
sum=∑i=0n∣ai−bi∣,考虑我们最终把
a
i
a_i
ai替换为了
a
j
a_j
aj,那么实际答案应为:
s
u
m
+
∣
a
j
−
b
i
∣
+
∣
a
i
−
b
i
∣
sum+|a_j-b_i|+|a_i-b_i|
sum+∣aj−bi∣+∣ai−bi∣。我们的目的就是最小化这个式子的值,由于
s
u
m
sum
sum是一个固定值,因此最小化
∣
a
j
−
b
i
∣
+
∣
a
i
−
b
i
∣
|a_j-b_i|+|a_i-b_i|
∣aj−bi∣+∣ai−bi∣即可,考虑枚举
i
i
i,那么
a
i
、
b
i
a_i、b_i
ai、bi也是一个定值,因此只需要最小化
∣
a
j
−
b
i
∣
|a_j-b_i|
∣aj−bi∣即可,显然可以通过二分来加速这个过程。
class Solution {
public:
int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {
vector<int> num=nums1;
sort(num.begin(),num.end());
using ll=long long;
ll ans=1e16,sum=0;
int n=nums1.size();
for(int i=0;i<n;i++)
sum+=abs(nums1[i]-nums2[i]);
for(int i=0;i<n;i++)
{
int idx=lower_bound(num.begin(),num.end(),nums2[i])-num.begin();
int tmp;
if(idx==0)
tmp=num[idx]-nums2[i];
else if(idx==n)
tmp=nums2[i]-num[idx-1];
else
tmp=min(num[idx]-nums2[i],nums2[i]-num[idx-1]);
ans=min(ans,sum+tmp-abs(nums1[i]-nums2[i]));
}
const int mod=1e9+7;
return ans%mod;
}
};