绝对差值和

题目链接:

给你两个正整数数组 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来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-absolute-sum-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解析

错误解法

看到这题的第一想法就是,找出差值最大的索引,然后替换nums1该位置的数据,获取到最小的绝对差值和

public static int minAbsoluteSumDiff(int[] nums1, int[] nums2) {int max = 0;int maxIndex = 0;int min =0;int minIndex = 0;int sum = 0;for(int i=0;i<nums1.length;i++){int tem = (nums1[i]-nums2[i])<0?(nums2[i]-nums1[i]):(nums1[i]-nums2[i]);if(tem>max){// 获取最大差值 以及最大差值出现的索引值max=tem;maxIndex = i;}// 绝对值差值和sum +=tem;}// 给min 初始值   决不能直接赋值零!!!min = max;for(int i=0;i<nums1.length;i++){int tem = (nums1[i]-nums2[maxIndex])<0?(nums2[maxIndex]-nums1[i]):(nums1[i]-nums2[maxIndex]);if(tem<min){// 获取最大差值 以及最大差值出现的索引值min=tem;minIndex = i;}}return sum-(max-min);}
// 反例
// int[] nums1 = [1,28,21]
// int[] nums2 = [9,21,20]

正解

之前的解法只是对最大差值处的数据做替换,有局限性,正如反例所示;
需要对每个索引上的数据做替换、比较,最终获取到一个新的差值nd与原来的差值x,当nd与x的差值绝对值最大时,这就是本题的解

    static int mod = (int)1e9+7;public static int minAbsoluteSumDiff(int[] nums1, int[] nums2) {int n = nums1.length;int[] sorted = nums1.clone();Arrays.sort(sorted);long sum = 0, max = 0;for (int i = 0; i < n; i++) {int a = nums1[i], b = nums2[i];if (a == b) continue;int x = Math.abs(a - b);sum += x;// 二分查找int l = 0, r = n - 1;while (l < r) {int mid = l + r + 1 >> 1;if (sorted[mid] <= b) l = mid;else r = mid - 1;}//  获取新的差值int nd = Math.abs(sorted[r] - b);//   获取最小新的差值// 当b为9时,r=4;// sorted[4]=7;   此时nd = 2// 但是最小差值应该是 sorted[5]=10,  此时 nd = 1;// 如果原数组中 10 改为9,会怎么样呢?if (r + 1 < n) nd = Math.min(nd, Math.abs(sorted[r + 1] - b));// x 为当前差值     max 最大差值 此差值为  x(旧差值) 与 nd(新差值)的改造if (nd < x) max = Math.max(max, x - nd);}return (int)((sum - max) % mod);}
// 测试用例
int[] nums1 = {1,10,4,4,2,7};
int[] nums2 = {9,3,5,1,7,4};

LeetCode1818:绝对差值和相关推荐

  1. python时区转换_在python 不同时区之间的差值与转换方法

    之前有个程序,里面有个时间部分是按照国内时区,也就是东八区,来写的,程序中定义了北京时间2点到八点进行检查:后面程序在国外机器上,例如说韩国,欧美等,执行的时候发现会有时间上的问题,因为获取的是机器的 ...

  2. ibm db2获取目标时间与当前时间的差值_高帧频视觉实时目标检测系统

    基于机器视觉的智能目标检测系统应用非常广泛,尤其在航天军工等领域中,经常涉及高速目标的实时检测和控制,对目标检测的智能性和实时性提出了更严格的要求.在这种应用中,视觉系统相对雷达.声纳具有信息量大.抗 ...

  3. CV03-双线性差值pytorch实现

    一.双线性差值 1.1 公式 在理解双线性差值(Bilinear Interpolation)的含义基础上,参考pytorch差值的官方实现注释,自己实现了一遍. 差值就是利用已知点来估计未知点的值. ...

  4. (C++)设计一个程序能计算一个日期加上若干天后是什么日期and计算日期差值

    输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数. 输出m行,每行按yyyy-mm-dd的个数输出. #include<cstdio>//判断是否是闰年 bool ...

  5. mysql取最早和最晚时间_SQL Server 按日期选择最晚日期与最早日期对应的数的差值...

    感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!表结构如下 number date 8 2009/1/11 2:00 7 2009/1/11 5:00 6 2009/1/11 ...

  6. R语言决策树、bagging、随机森林模型在训练集以及测试集的预测结果(accuray、F1、偏差Deviance)对比分析、计算训练集和测试集的预测结果的差值来分析模型的过拟合(overfit)情况

    R语言决策树.bagging.随机森林模型在训练集以及测试集的预测结果(accuray.F1.偏差Deviance)对比分析.计算训练集和测试集的预测结果的差值来分析模型的过拟合(overfit)情况 ...

  7. 影像组学视频学习笔记(33)-使用SimpleITK实现医学影像差值、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/afcd06221ea4 来源:简书,已获转载授权 RadiomicsWorld.com "影像组学世界" ...

  8. sql 差值_使用Blink CEP实现差值聚合计算

    简介: 本文介绍通过CEP实现实时流上的差值聚合计算. 使用Blink SQL+UDAF实现差值聚合计算介绍了如何使用Blink SQL+UDAF实现实时流上的差值聚合计算,后来在与@付典就业务需求和 ...

  9. mysql查询每小时数据和上小时数据的差值

    一.前言 需求是获取某个时间范围内每小时数据和上小时数据的差值以及比率.本来以为会是一个很简单的sql,结果思考两分钟发现并不简单,网上也没找到参考的方案,那就只能自己慢慢分析了. 刚开始没思路,就去 ...

  10. 将一个数组划分为和差值最小的子数组

    要求:将数组中的数划分为两组,使得两个子数组的和的差值最小,数组中的数的取值范围为0<X<100,元素个数也是大于0小于100.如:a[]={2,4,5,6,7},得出的两组数:{2,4, ...

最新文章

  1. 程序员哪个时间敲代码效率最高?| 每日趣闻
  2. android 5.0主题风格研究
  3. swiper 定义放多少张图片_swiper轮播问题之二:默认显示3张图片,中间显示全部两边显示部分...
  4. 网络推广期间新站收录慢网络推广专员如何作答?
  5. Android中关于线性布局基线对齐的讲述
  6. 欢迎使用CSDN-markdown编辑器12213123
  7. 通过ADO压缩数据库
  8. 值得一做》关于并查集的进化题目 BZOJ1015(BZOJ第一页计划)(normal-)
  9. mvc ajax图片上传,MVC 通过ajaxSubmit上传图片并显示
  10. nyoj 最强DE 战斗力 (数论入门)
  11. win7安装Python所需资源
  12. [RK3288][Android6.0] 调试笔记 --- RT5640播放时的Codec寄存器列表
  13. 走进音视频的世界——新一代开源编解码器AV1
  14. iOS iPhone各机型尺寸及导航栏高度
  15. 如何测试光纤系统中的插入损耗
  16. lattice planner
  17. 如何将手机的网络代理给电脑 win10
  18. fanuc机器人负载设定
  19. 当 Rainbond 遇上龙蜥!小龙带你玩转一站式云原生,点击开启
  20. uhs3内存卡有哪些_可能是目前性价比最高的UHS-II SD卡

热门文章

  1. Struts1 和 Struts2
  2. 地理信息系统实习教程 第26章 地图注记
  3. 按自己的思想写商业计划
  4. html 一键转发微信朋友圈,微信公众号H5,分享朋友,分享朋友圈处理
  5. 【软件工程】 期末考试 重点复习
  6. 网络协议之NAT穿透原理
  7. 聚类算法——KMeans(K-均值)
  8. smail语法 clinit和init的区别
  9. 修改Spring Boot自定义图标
  10. termux安装ubuntu