给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n 。

数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)的 总和(下标从 0 开始)。

你可以选用 nums1 中的 任意一个 元素来替换 nums1 中的 至多 一个元素,以 最小化 绝对差值和。

在替换数组 nums1 中最多一个元素 之后 ,返回最小绝对差值和。因为答案可能很大,所以需要对 109 + 7 取余 后返回。

|x| 定义为:

  • 如果 x >= 0 ,值为 x ,
  • 如果 x <= 0 ,值为 -x

示例 1:输入:nums1 = [1,7,5], nums2 = [2,3,5]
输出:3
解释:有两种可能的最优方案:
- 将第二个元素替换为第一个元素:[1,7,5] => [1,1,5] ,或者
- 将第二个元素替换为第三个元素:[1,7,5] => [1,5,5]
两种方案的绝对差值和都是 |1-2| + (|1-3| 或者 |5-3|) + |5-5| = 3
示例 2:输入:nums1 = [2,4,6,8,10], nums2 = [2,4,6,8,10]
输出:0
解释:nums1 和 nums2 相等,所以不用替换元素。绝对差值和为 0
示例 3:输入:nums1 = [1,10,4,4,2,7], nums2 = [9,3,5,1,7,4]
输出:20
解释:将第一个元素替换为第二个元素:[1,10,4,4,2,7] => [10,10,4,4,2,7]
绝对差值和为 |10-9| + |10-3| + |4-5| + |4-1| + |2-7| + |7-4| = 20

解题思路

  • 绝对差值,可以看为由nums1[i]、nums2[i]两个元素组成,所以我们这次需要处理的就是n个这样的数对。
  • 对于每个nums2[i],我们使用二分法,可以在nums1数组中快速找到最接近nums2[i]的元素,这个元素就是可以替换nums1[i]的元素,通过比较原nums1[i]、nums2[i]的差值和替换以后的差值,这个差值就是对于绝对差值和的减益,选出最大的那个减益,就是使得绝对差值和最小化的方案。

代码

class Solution {public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {int mod=1000000007;long dif = 0;int n = nums1.length,  max = 0, maxi = -1;List<int[]> list = new ArrayList<>();for (int i = 0; i < n; i++) {int abs = Math.abs(nums1[i] - nums2[i]);if (abs != 0) {list.add(new int[]{nums2[i], abs});}dif += abs;}Arrays.sort(nums1);int gap=0;for (int i=0;i<list.size();i++){int abs=100001;int r = bs(nums1, list.get(i)[0]),l=r-1;if(r<n)abs=Math.min(abs,Math.abs(nums1[r]-list.get(i)[0]));if(l>=0)abs=Math.min(abs,Math.abs(nums1[l]-list.get(i)[0]));gap=(Math.max(gap,list.get(i)[1]-abs));}return (int)((dif-gap)%mod);}public int bs(int[] nums1,int tar ){int l=0,r=nums1.length-1;while (l<=r){int mid=(r-l)/2+l;if(nums1[mid]>=tar)r=mid-1;else l=mid+1;}return l;}
}

leetcode 1818. 绝对差值和相关推荐

  1. LeetCode 1818. 绝对差值和(二分查找)

    文章目录 1. 题目 2. 解题 前三题,拼手速.最后一题暴力超时. 1. 题目 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差 ...

  2. 【LeetCode】1818. 绝对差值和

    题目 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= ...

  3. 力扣—1818.绝对差值和

    题目: 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 < ...

  4. 力扣 1818. 绝对差值和 数学 二分

    https://leetcode-cn.com/problems/minimum-absolute-sum-difference/ 思路:首先计算sum=∑i=0n∣ai−bi∣sum=\sum_{i ...

  5. leetcode 1818 绝对值,排序,二分法,最大值

    1818. 绝对差值和 难度中等130收藏分享切换为英文接收动态反馈 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为 ...

  6. LeetCode 910. 最小差值 II(贪心)

    1. 题目 给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 B 的最大值和 B ...

  7. LeetCode 908. 最小差值 I

    1. 题目 给定一个整数数组 A,对于每个整数 A[i],我们可以选择任意 x 满足 -K <= x <= K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 ...

  8. sql 差值_SQL_LeetCode的连续性题目

    本篇分享一道来自于leetcode中文版第180题,关于SQL处理连续性的题目. 原题目:编写一个 SQL 查询,查找所有至少连续出现三次的数字. 数据表Logs如下: ID Num 1 1 2 1 ...

  9. 21-7-14 绝对差值和

    绝对差值和 难度[中等] 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i ...

最新文章

  1. IBM沃森健康项目受挫 人工智能在医疗领域前景几何
  2. GMV突破1300亿,Lazada下一站去哪?
  3. python sip模块(为C和C++库创建Python绑定)
  4. 效果器的使用技巧-与调音台的无缝连接
  5. vm12 和 centos 下载地址
  6. AI画家挑战毕加索,一小时画9张画,关键是居然真有人买
  7. ftp服务器的创建文件夹,ftp服务器创建文件夹命令
  8. junit5 入门系列教程-14-junit5 重复测试(@RepeatedTest)
  9. 拆解日本松下的老古董收录机,感受50年前的电路设计,满满的历史感
  10. python里面的pip是什么意思_python的pip有什么用
  11. html 中的版权符号 : 圆圈C
  12. WEB通信之 长连接、长轮询(long polling)
  13. Ubuntu安装Times NewRoman字体
  14. 海尔简爱s11装Linux,海尔简爱S11值得买吗 海尔简爱S11全面深度评测详解
  15. NER文献溯源-v2核心技术方法
  16. 线程八股文--藤原豆腐店自用
  17. 操作系统实验Ucore:Kernel_init(四)
  18. 获奖喜讯 | 中恒科技连获第十一届“龙图杯”全国BIM大赛三项大奖
  19. Bugku-CTF (web 持续更新) ——新手ctf记录
  20. flink笔记1(初识 Flink)

热门文章

  1. 23. 合并K个排序链表
  2. Java-进阶:Java-File--IO—2
  3. 系统盘点Android开发者必须掌握的知识点,含小米、腾讯、阿里
  4. 第五周课程总结实验报告(三)
  5. [UE4]删除UI:Remove from Parent
  6. 分库分表的几种常见形式以及可能遇到的难题
  7. php变量的数据类型
  8. HTTP 协议 -- 浏览器缓存机制
  9. HTML 页面源代码布局介绍
  10. jMatter:提高开发速度10倍!