一、题目

image.png

二、分析与解答

分析:i 处对答案的贡献为 | nums1[i] - nums2[i] | ,若用元素 nums1[j] 替换 nums1[i] 那么贡献变为 | nums1[j] - nums2[i] |。两者的差值尽可能大 | nums1[i] - nums2[i] | - | nums1[j] - nums2[i] |。
检查每一个 i 对应的差值,当 i 确定时,前半部分大小确定;而后半部分取决于 j 的选择,因此利用二分查找在 nums1 中查找 nums1[j] 尽可能的接近 nums1[i]。

  1. class Solution {
  2. public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {
  3. final int MOD = 1000000007;
  4. int n = nums1.length;
  5. int[] rec = new int[n];
  6. System.arraycopy(nums1, 0, rec, 0, n);
  7. Arrays.sort(rec);
  8. int sum = 0, maxn = 0;
  9. for (int i = 0; i < n; i++) {
  10. int diff = Math.abs(nums1[i] - nums2[i]);
  11. sum = (sum + diff) % MOD;
  12. int j = binarySearch(rec, nums2[i]);
  13. if (j < n) {
  14. maxn = Math.max(maxn, diff - (rec[j] - nums2[i]));
  15. }
  16. if (j > 0) {
  17. maxn = Math.max(maxn, diff - (nums2[i] - rec[j - 1]));
  18. }
  19. }
  20. return (sum - maxn + MOD) % MOD;
  21. }
  22. public int binarySearch(int[] rec, int target) {
  23. int low = 0, high = rec.length - 1;
  24. if (rec[high] < target) {
  25. return high + 1;
  26. }
  27. while (low < high) {
  28. int mid = (high - low) / 2 + low;
  29. if (rec[mid] < target) {
  30. low = mid + 1;
  31. } else {
  32. high = mid;
  33. }
  34. }
  35. return low;
  36. }
  37. }