# 1818. Minimum Absolute Sum Difference
###### tags: `Leetcode` `Medium` `Binary Search`
Link: https://leetcode.com/problems/minimum-absolute-sum-difference/description/
## 思路
对于每一个idx i,用binary search找到nums1里面最接近nums2[i]的element 然后替换 算出absolute sum difference 取最小的一个就是答案
方法一是先算出original的absolute sum difference 然后一个idx一个idx尝试 算出替换后的absolute sum difference
方法二是只遍历一遍 在过程中算出original sum difference 每次比较gain (```abs(nums1[i]-nums2[i])-替换后的absolute difference```) 找到最大的gain 答案是original-gain
## Code
方法一
```java=
class Solution {
public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {
int n = nums1.length, mod = 1000000007;
long original = 0;
for(int i=0; i<n; i++) original += Math.abs(nums1[i]-nums2[i]);
int[] arr = nums1.clone();
Arrays.sort(arr);
long ans = original;
for(int i=0; i<n; i++){
int idx = binarySearch(arr, nums2[i]);
if(idx!=n) ans = Math.min(ans, original-(Math.abs(nums1[i]-nums2[i]))+Math.abs(arr[idx]-nums2[i]));
if(idx!=0) ans = Math.min(ans, original-(Math.abs(nums1[i]-nums2[i]))+Math.abs(arr[idx-1]-nums2[i]));
}
return (int)(ans%mod);
}
public int binarySearch (int[] arr, int num){
int start = 0, end = arr.length;
while(start<end){
int mid = start+(end-start)/2;
if(arr[mid]<num) start = mid+1;
else end = mid;
}
return start;
}
}
```
方法二
```java=
class Solution {
public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {
int n = nums1.length, mod = 1000000007;
long original = 0, maxDecrement = 0;
int[] arr = nums1.clone();
Arrays.sort(arr);
for(int i=0; i<n; i++){
int currDiff = Math.abs(nums1[i]-nums2[i]);
original += currDiff;
int idx = binarySearch(arr, nums2[i]);
if(idx!=n) maxDecrement = Math.max(maxDecrement, currDiff-Math.abs(arr[idx]-nums2[i]));
if(idx!=0) maxDecrement = Math.max(maxDecrement, currDiff-Math.abs(arr[idx-1]-nums2[i]));
}
return (int)((original-maxDecrement)%mod);
}
public int binarySearch (int[] arr, int num){
int start = 0, end = arr.length;
while(start<end){
int mid = start+(end-start)/2;
if(arr[mid]<num) start = mid+1;
else end = mid;
}
return start;
}
}
```