给你两个正整数数组 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

这题看的第一眼就想用暴力,如果直接暴力抱歉直接给你个超时,不过可以改变下暴力的做法,因为他们只改变了一个数,我们只要原始的和减去Math.abs(nums1[i]-nums2[i])-Math.abs(num1[j]-num2[i]) 只要减去替换后改变的数值,就可以了。之后,只需要找到最小值就行了。本次主要用二分解决,其实二分也是在暴力的基础上,做改进的。

二分查找

题中说替换nums1中至多一个数,来求最小化绝对差值和。既然是这样,我们只需要针对nums2中的每一个数来找num1中最接近num2中的数,最接近的就是绝对差值最小的,也就是我们要替换的。但是num1是无序的,但又不能改变num1的顺序,只能复制num1数组,可以用Arrays.copy或System.arraycopy(Object var0, int var1, Object var2, int var3, int var4)[var0:要复制的数组,var1:要复制的数组起始位置,var2:保存数据的目标数组,var3:目标数组的下标位置,var4:每次复制的长度],然后进行排序,这样的话我们就可以进行排序了,然后我们把nums2中的数作为target在num1中复制的新数组中用二分查找,保存最小绝对值差和(不需要每次都去求循环去求,关于这点上面已经提过),最后就可以求出答案了。

代码:

class Solution {public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {final int mod=1000000007;//因为绝对差值和会超过范围需要取余int []res=Arrays.copyOf(nums1,nums1.length);//res为复制num1后的新数组Arrays.sort(res);int sum=0;//int maxSub=0;for(int i=0;i<nums1.length;i++){int sub=Math.abs(nums1[i]-nums2[i]);sum=(sum+sub)%mod;//求原始绝对差值和int j=binarySearch(res,nums2[i]);//查找当前nums2在res中 最接近的下标//由于是求绝对值所以两边都判断if(j<nums1.length){//大于num2[i]的数maxSub=Math.max(maxSub,sub-(res[j]-nums2[i]));}if(j>0){//小于nums2[i]的数maxSub=Math.max(maxSub,sub-(nums2[i]-res[j-1]));}}return (sum-maxSub+mod)%mod;//由于可能sum<maxSub}public static int binarySearch(int[] res,int target){int left=0,right=res.length-1;if(target>res[res.length-1]){return res.length;}while(left<right){int mid=(right-left)/2+left;if(res[mid]>=target){right=mid;}else{left=mid+1;}}return right;}
}

LeetCode刷题之1818. 绝对差值和相关推荐

  1. Leetcode刷题之旅1

    Leetcode刷题之旅1 先从剑指offer66题开始刷 链表可创建dummy哑节点指向头指针,目的是为了对头节点进行操作 例子:删除链表中重复节点 确定有限状态自动机 例子:剑指offer20 表 ...

  2. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

  3. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  4. LeetCode 刷题之路(python版)

    摘自:https://blog.csdn.net/qq_32384313/article/details/90745354 LeetCode 刷题之路(python版) 小坏wz 2019-06-02 ...

  5. wy的leetcode刷题记录_Day45

    wy的leetcode刷题记录_Day45 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间:2022-11-18 前言 补 目录 wy的leetcode刷题记录_Da ...

  6. 【LeetCode刷题日记】常用算法基础和理解及运用

    在我们LeetCode刷题过程中,如果我们只是了解数据结构(数组,链表,数)的使用方法,那我们在面对复杂的题目时,是很难很好的解决问题的,因此我们要了解一些常用算法来帮助我们更好的解题. 递归和迭代 ...

  7. Leetcode刷题

    刷题 leetcode 1.两数之和 #哈希表 class Solution:def twoSum(self, nums: List[int], target: int) -> List[int ...

  8. 个人LeetCode刷题记录(带题目链接及解答)持续更新

    Leetcode 刷题 注:~[完成]代表还有一些方法没看,最后再看 一.一些需要重刷的典型题: 1.快速排序,归并排序,堆排序(递归的思想) 2.链表中的回文链表,其中的快慢指针,多看,多练 3.链 ...

  9. LeetCode刷题C++实录

    LeetCode刷题C++实录 1. 两数之和 121. 买卖股票的最佳时机 382. 链表随机节点 622. 设计循环队列 623. 在二叉树中增加一行 640. 求解方程 761. 特殊的二进制序 ...

  10. LeetCode刷题模板(1):《我要打10个》之二分法

    Author       :  叨陪鲤 Email         : vip_13031075266@163.com Date          : 2021.01.23 Copyright : 未 ...

最新文章

  1. 【Python】详解Python模块、包、库
  2. MFC拖拽文件到任意EDIT控件
  3. mysql中给用户添加密码_MySql中添加用户,新建数据库,用户授权,删除用户,修改密码...
  4. pytorch图像检索评价指标MAP
  5. 深入理解 Cilium 的 eBPF(XDP)收发包路径:数据包在Linux网络协议栈中的路径
  6. Joseph_Circle(约瑟夫环)
  7. Eclipse Photon即将发布
  8. Python操作SQLAlchemy
  9. fcpx教程,如何在 final cut pro 中导出视频的图文?
  10. 计算机一级考试考什么呢,计算机一级考试考些什么呢
  11. matlab在mac中好用吗,Matlab Mac版上手
  12. 狂神JAVA博客MySQL_狂神说SpringBoot08:整合Druid
  13. 快递物流查询,分析派件时效,查找正在派件的单号
  14. 24点问题(增加数据)·回溯
  15. gethostbyname linux,gethostbyname()
  16. 烟台大学计算机学院王文学,杨玉军-烟台大学 数学与信息科学学院
  17. 《大学“电路分析基础”课程实验合集.实验五》丨线性有源二端网络等效电路的研究
  18. TextGrabber重大更新,识别文字并实时离线翻译,支持中文
  19. 嵌入式设备web服务器
  20. scrapy custom_settings

热门文章

  1. (三)smali 入门
  2. 十年程序人生——黎活明给程序员的忠告
  3. Spring IoC 详解(下篇)
  4. xmapp_mysql端口冲突解决
  5. 【CGAL】编译(windos)
  6. 软件开发流程规范介绍
  7. 三维浮雕软件 linux,立体浮雕工具下载 Type3(立体浮雕软件) v4.6.0.0 免费安装版 下载-脚本之家...
  8. 机器视觉培训教程-如何选择合适的灯源
  9. 基于蒙特卡诺的风场景模型出力(Matlab代码实现)
  10. 宏电GPRS DTU H7210调试报告(参数配置)