classSolution{ /* * HashSet * 取余 */ publicintminAbsoluteSumDiff(int[] nums1, int[] nums2){ int result = 0; int n = nums1.length; int MOD = 1000000007;
// 用TreeSet来存储数组1中的元素 TreeSet<Integer> set = new TreeSet<>(); for (int i : nums1) { set.add(i); }
// 更改方案能减少的最大差值 int max = 0; for (int i = 0; i < n; i++) { int temp = Math.abs(nums1[i] - nums2[i]);
int num2 = nums2[i];
// 寻找num2在数组1中对应的上边界和下边界(也就是最接近于num2的大于他的数和小于他的数) int floor = set.floor(num2) == null? -100000: set.floor(num2); int ceil = set.ceiling(num2) == null? -100000: set.ceiling(num2);
int floorGap = Math.abs(floor - num2); int ceilGap = Math.abs(ceil - num2);
// 比较这次修改能带来的最大差值 max = Math.max(max, Math.max(temp - floorGap, temp - ceilGap)); // (a + b) % c = (a%c + b%c) % c result = (result % MOD + temp % MOD) % MOD; }