附原题传送门绝对差值和
最开始看到这个题目的时候,想到用贪心算法,先找到差值最大的然后在替换成差值最小的数,代码写完开开心的提交上。最后发现在 [1,28,21] [9,21,20] 这一组数据的时候实际输出: 16 预期结果: 9。显然这种解法是不能通过所有的测试用例的,然后想到了用二分查找加排序的思想。
上代码
class Solution {
int mod=(int)1e9+7;
public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {
int n=nums1.length;
long res=0;
int max=0;
// 将数组1进行拷贝并排序 以便在后续寻找最佳替换
int[] sorted=nums1.clone();
Arrays.sort(sorted);
for(int i=0;i<n;i++){
if(nums1[i]==nums2[i]) continue;
int tmp=Math.abs(nums1[i]-nums2[i]);
res+=tmp;
int l=0,r=n-1;
while(l<r){
int mid = l + r+1>>1;
if (sorted[mid] <= nums2[i]) l = mid;
else r = mid - 1;
}
int nd = Math.abs(sorted[r] - nums2[i]);
if (r + 1 < n) nd = Math.min(nd, Math.abs(sorted[r + 1] - nums2[i]));
if (nd < tmp) max = Math.max(max, tmp - nd);
}
return (int)((res - max) % mod);
}
}