题目大意
思路分析
分析
题目大意就是可以更换nums1
中的一个数为nums1中的另一个数,最后让绝对值之和最小,容易想到的贪心策略是找到绝对值最大
的那一组,然后更换对应的数让它变小,后来发现这种贪心是不对的
,比如[8,0,9] 和[6,7,7]
,只会越换越大,所以应该扫描一遍nums1
,维护出更换nums[i]
后绝对值减小的最大值;
坑点
- 更换
nums[i]
时,应该贪心的更换左右两边距离nums2[i]
最近的,这里采用二分,注意越界的判定; - 最后一定要记得(res-mx+mod)%mod,因为res是模后的结果,mx这里没有取模,所以res-mx可能会出现赋值,但是leetcode数据比较水;
AC代码
class Solution {
public:
int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {
const int mod=1e9+7;
set<int> st;
for(auto x:nums1) st.insert(x);
long long res=0;
long long mx=0;
for(int i=0;i<nums1.size();i++){
int now=abs(nums1[i]-nums2[i]);
res=(res+now)%mod;
auto it=st.lower_bound(nums2[i]);
int tmp=1e5+10;
if(it!=st.end()) tmp=min(tmp,abs(*it-nums2[i]));
if(it!=st.begin()) {
it--;
tmp=min(tmp,abs(*it-nums2[i]));
}
mx=max(mx,abs(now-tmp)*1ll);
}
return (int)(res-mx+mod)%mod;
}
};