1818绝对差值和

思路

拿到题首先简单分析一下:

  1. 因为nums1和nums2的长度都是n,而1≤n≤1051\le n \le 10^51≤n≤105,所以最多只能使用O(nlogn)O(nlogn)O(nlogn)的算法;
  2. nums1中最多只能进行一次元素替换操作,可以不进行替换。

因为求的是——进行最多一次替换后的最小绝对差值和,所以

  1. 若原本的绝对差值和就是0,那就不用进行替换了;
  2. 如果需要替换,又因为只能替换一次,那就需要找到可以最大程度减少绝对差值和的一次替换,然后在原本的绝对值和的基础上减去这一次的减少量即可;

所以得到如下的算法步骤:

  1. 首先计算不进行替换的绝对差值和ans,如果此时的ans=0,则直接返回0
  2. 否则,利用数组sub记录每一对的绝对差值
  3. 因为只能对nums1中的元素使用替代操作,所以将nums1中的元素存入TreeSet中,方便后续进行处理(有很多人使用的是二分查找来寻找合适的值,因为前几天曾经使用过TreeMap的floorKey做过题,这次使用TreeSet的floor和ceiling方法来做,但是这样的时间复杂度高了很多);
  4. 无视题目要求,可以进行无限次替换操作,使用TreeSet中的ceiling(i)和floor(i)找到nums2中当前元素对应nums1中最接近的两个元素求出nums2中每一个元素对应最佳的绝对差值,并与sub中对应的值相减,从而找到最大的减少量max
  5. 使用(ans-max+mod)%mod,然后返回即可。

因为TreeSet增删改查的时间复杂度都是O(logn)O(logn)O(logn),再加上嵌套的循环,所以总的时间复杂度为O(nlogn)O(nlogn)O(nlogn)
空间复杂度为O(2n)O(2n)O(2n),其中使用sub存储元素的绝对差值、使用Treeset存储nums1的元素分别使用了O(n)O(n)O(n)的空间

代码

class Solution {public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {//因为n的长度为1e5所以最多只能使用nlogn的时间复杂度 n更好//最多只能替换一个元素int mod = (int) 1e9+7;int len = nums1.length;int ans = 0;int[] sub = new int[len];TreeSet<Integer> ts = new TreeSet<>();for (int i=0;i<len;i++){sub[i] = nums1[i]-nums2[i]>0?nums1[i]-nums2[i]:nums2[i]-nums1[i];ans = (ans + sub[i])%mod;ts.add(nums1[i]);}if (ans==0)return 0;int max = Integer.MIN_VALUE;for (int i=0;i<len;i++){int c = ts.ceiling(nums2[i])==null?Integer.MAX_VALUE:ts.ceiling(nums2[i]);int f = ts.floor(nums2[i])==null?Integer.MAX_VALUE:ts.floor(nums2[i]);int per = Math.abs(c-nums2[i])>Math.abs(f-nums2[i])?Math.abs(f-nums2[i]):Math.abs(c-nums2[i]);max = Math.max(sub[i]-per,max);}return (ans-max + mod) % mod;}
}

Leetcode---1818绝对差值和相关推荐

  1. leetcode 1818. 绝对差值和

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. LeetCode 908. 最小差值 I

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

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

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

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

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

最新文章

  1. 【LorMe云讲堂】梁玉婷:农田土壤微生物共存与功能识别调控
  2. Windows Server 2008自定义任务栏和开始菜单
  3. SQL结构化查询语言中的LIKE语句
  4. hdu 6106 Classes
  5. 产品经理网站数据分析之测量问题现状(二)
  6. ajax的模式_AJAX的完整形式是什么?
  7. Y COMBINATOR的六大强悍女人-转自应用电台
  8. 【数字信号调制】基于matlab 16QAM信号调制解调【含Matlab源码 2050期】
  9. Teclast/台电32G SM3267AC H27UDG8M2MTR 量产记录
  10. Word | 添加图题/图注、插入题注、设置插入题注快捷键...
  11. 小米组织架构调整:雷军兼任中国区总裁,王川组建大家电部发力白电市场
  12. 图片阴影效果和影子效果
  13. 华为机试题:求偶数个复数的平均值
  14. 2021011029王芯悦-实验1
  15. 广告(文案)与营销(市场、传播和创意)
  16. c语言程序设计猴博士资源,猴博士课堂C语言学习笔记第三弹
  17. 服务器如何隐藏真实IP地址?服务器隐藏真实IP的方法
  18. 数据采集:如何自动化采集数据
  19. kafka:默认的分区策略
  20. [系统安全] 二十二.PE数字签名之(下)微软证书漏洞CVE-2020-0601复现及Windows验证机制分析

热门文章

  1. 程序设计基础知识点整理,超全!!!
  2. java 给pdf加水印
  3. 国外15种手机游戏引擎和开发工具介绍
  4. win10企业版2016长期服务版 无法远程桌面
  5. 第22次 CCF CSP认证一二题题解及感悟
  6. 直播企业掀“冲击IPO”浪潮,为何老玩家成受益者?
  7. 快速下载各类网页视频插件~COCOCUT
  8. 生化危机5显示无法连接服务器,《生化危机5》黄金版无法联机怎么办?
  9. cad沿线插入块 lisp_我有一组数有十几万个坐标点,如何利用lisp程序快速导入CAD中,并可以快速处理!...
  10. 二进制转十六进制的详细步骤