1818. 绝对差值和
1. 题目描述
数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)的 总和(下标从 0 开始)。
你可以选用 nums1 中的 任意一个 元素来替换 nums1 中的 至多 一个元素,以 最小化 绝对差值和。
在替换数组 nums1 中最多一个元素 之后 ,返回最小绝对差值和。因为答案可能很大,所以需要对 109 + 7 取余 后返回。
|x| 定义为:
如果 x >= 0 ,值为 x ,或者
如果 x <= 0 ,值为 -x
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-absolute-sum-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 代码描述
2.1 题目内容
修改nums1[]数组内某一个数值,修改方法为以nums1[]数组内某一值复制修改,能被修改的位置只有一处。求经此修改后,两个数组的差值绝对值之和最小的答案。
2.2 代码思路
a.对于nums1[]进行排序
b.利用二分法查找
c.maxn相对于初始时差值减少量
2.3 代码细节
2.3.1 vector<int> rec(nums1)
此处使用vector的复制,将nums1赋值于rec
2.3.2 lower_bound()
二分查找
3. 代码
3.1代码内容
class Solution {
public:
const int mod = 1e9+7;
int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {
vector<int> rec(nums1);
sort(rec.begin(),rec.end());
long long maxn = 0,diff = 0,sum = 0;
int n = nums1.size();
for(int i=0;i<n;i++){
diff = abs(nums1[i]-nums2[i]);
sum += diff;
int j = lower_bound(rec.begin(),rec.end(),nums2[i])-rec.begin();
if(j<n)
maxn = max(maxn, diff - (rec[j]-nums2[i]));
if(j>0)
maxn = max(maxn, diff - (nums2[i]-rec[j-1]));
}
return (sum + mod - maxn)%mod;
}
};