0
点赞
收藏
分享

微信扫一扫

绝对差值和

西特张 2021-09-21 阅读 41
今日算法
题目描述:
示例 1:
  • 将第二个元素替换为第一个元素:[1,7,5] => [1,1,5] ,或者
  • 将第二个元素替换为第三个元素:[1,7,5] => [1,5,5]
    两种方案的绝对差值和都是 |1-2| + (|1-3| 或者 |5-3|) + |5-5| = 3
输入:nums1 = [2,4,6,8,10], nums2 = [2,4,6,8,10]

输出:0
解释:nums1 和 nums2 相等,所以不用替换元素。绝对差值和为 0

示例 3:
题目分析:
  1. 要求最小绝对差值之和
  2. 只可以替换nums1中的一个数
  3. nums1中替换的元素,与
思路一:
代码实现:
class Solution {
    public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {
       final int mod = 1000000007;
       int len = nums1.length;
       int minNum = 0, index = 0, mark = 0;
       // 求nums1中的替换的那个元素
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                    int num = Math.abs(nums2[i] - nums1[j]);
                    int val = Math.abs(nums2[i] - nums1[i]);
                    // 只有差值小于val才有替换的需要
                    if (num >= val) {
                        continue;
                    }
                    // 判断替换的值是否是最小绝对差值
                    int result = val - num;
                    if (minNum < result) {
                          minNum = result;
                          index = j;
                          mark = i;
                     }
                }    
        }
        // 替换
        nums1[mark] = nums1[index];
        // 求最小绝对差值之和
        int sum = 0;
        for (int i = 0; i < len; i++) {
            sum += Math.abs(nums1[i] - nums2[i]);
        }
        return sum % mod;
    }
}
思路二:
代码实现:
class Solution {
    public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {
       final int mod = 1000000007;
       int len = nums1.length;
       int[] arr = new int[len];
       System.arraycopy(nums1, 0, arr, 0, len);
       Arrays.sort(arr);
       int sum = 0, maxNum = 0;
       for (int i = 0; i < len; i++) {
           int diff = Math.abs(nums1[i] - nums2[i]);
           sum = (sum + diff) % mod;
           int index = binary(arr, nums2[i]);
               maxNum = Math.max(maxNum, diff - index);
       }
       return (sum - maxNum + mod) % mod;
    }

    public int binary(int[] arr, int target) {
         int low = 0, high = arr.length - 1;
        if (arr[high] <= target) {
            return target - arr[high];
        } else if (arr[low] >= target) {
            return arr[low] - target;
        }

        while (low < high) {
            int mid = (high - low) / 2 + low;
            if (arr[mid] < target) {
                low = mid + 1;
            } else {
                high = mid;
            }
        }
        int minNum = Math.min(target - arr[low - 1], arr[low] - target);
        return minNum;
    }
}
举报

相关推荐

0 条评论