Leetcode---1818绝对差值和
1818绝对差值和
思路
拿到题首先简单分析一下:
- 因为nums1和nums2的长度都是n,而1≤n≤1051\le n \le 10^51≤n≤105,所以最多只能使用O(nlogn)O(nlogn)O(nlogn)的算法;
- nums1中最多只能进行一次元素替换操作,可以不进行替换。
因为求的是——进行最多一次替换后的最小绝对差值和,所以
- 若原本的绝对差值和就是0,那就不用进行替换了;
- 如果需要替换,又因为只能替换一次,那就需要找到可以最大程度减少绝对差值和的一次替换,然后在原本的绝对值和的基础上减去这一次的减少量即可;
所以得到如下的算法步骤:
- 首先计算不进行替换的
绝对差值和ans
,如果此时的ans=0
,则直接返回0
; - 否则,利用
数组sub记录每一对的绝对差值
; - 因为只能对nums1中的元素使用替代操作,所以
将nums1中的元素存入TreeSet
中,方便后续进行处理(有很多人使用的是二分查找来寻找合适的值,因为前几天曾经使用过TreeMap的floorKey做过题,这次使用TreeSet的floor和ceiling方法来做
,但是这样的时间复杂度高了很多); - 无视题目要求,可以进行无限次替换操作,
使用TreeSet中的ceiling(i)和floor(i)找到nums2中当前元素对应nums1中最接近的两个元素
,求出nums2中每一个元素对应最佳的绝对差值
,并与sub中对应的值相减
,从而找到最大的减少量max
; - 使用
(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绝对差值和相关推荐
- leetcode 1818. 绝对差值和
给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i ...
- LeetCode 1818. 绝对差值和(二分查找)
文章目录 1. 题目 2. 解题 前三题,拼手速.最后一题暴力超时. 1. 题目 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差 ...
- 【LeetCode】1818. 绝对差值和
题目 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= ...
- 力扣—1818.绝对差值和
题目: 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 < ...
- 力扣 1818. 绝对差值和 数学 二分
https://leetcode-cn.com/problems/minimum-absolute-sum-difference/ 思路:首先计算sum=∑i=0n∣ai−bi∣sum=\sum_{i ...
- leetcode 1818 绝对值,排序,二分法,最大值
1818. 绝对差值和 难度中等130收藏分享切换为英文接收动态反馈 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为 ...
- LeetCode 910. 最小差值 II(贪心)
1. 题目 给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 B 的最大值和 B ...
- LeetCode 908. 最小差值 I
1. 题目 给定一个整数数组 A,对于每个整数 A[i],我们可以选择任意 x 满足 -K <= x <= K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 ...
- sql 差值_SQL_LeetCode的连续性题目
本篇分享一道来自于leetcode中文版第180题,关于SQL处理连续性的题目. 原题目:编写一个 SQL 查询,查找所有至少连续出现三次的数字. 数据表Logs如下: ID Num 1 1 2 1 ...
- 21-7-14 绝对差值和
绝对差值和 难度[中等] 给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n . 数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i ...
最新文章
- 【LorMe云讲堂】梁玉婷:农田土壤微生物共存与功能识别调控
- Windows Server 2008自定义任务栏和开始菜单
- SQL结构化查询语言中的LIKE语句
- hdu 6106 Classes
- 产品经理网站数据分析之测量问题现状(二)
- ajax的模式_AJAX的完整形式是什么?
- Y COMBINATOR的六大强悍女人-转自应用电台
- 【数字信号调制】基于matlab 16QAM信号调制解调【含Matlab源码 2050期】
- Teclast/台电32G SM3267AC H27UDG8M2MTR 量产记录
- Word | 添加图题/图注、插入题注、设置插入题注快捷键...
- 小米组织架构调整:雷军兼任中国区总裁,王川组建大家电部发力白电市场
- 图片阴影效果和影子效果
- 华为机试题:求偶数个复数的平均值
- 2021011029王芯悦-实验1
- 广告(文案)与营销(市场、传播和创意)
- c语言程序设计猴博士资源,猴博士课堂C语言学习笔记第三弹
- 服务器如何隐藏真实IP地址?服务器隐藏真实IP的方法
- 数据采集:如何自动化采集数据
- kafka:默认的分区策略
- [系统安全] 二十二.PE数字签名之(下)微软证书漏洞CVE-2020-0601复现及Windows验证机制分析
热门文章
- 程序设计基础知识点整理,超全!!!
- java 给pdf加水印
- 国外15种手机游戏引擎和开发工具介绍
- win10企业版2016长期服务版 无法远程桌面
- 第22次 CCF CSP认证一二题题解及感悟
- 直播企业掀“冲击IPO”浪潮,为何老玩家成受益者?
- 快速下载各类网页视频插件~COCOCUT
- 生化危机5显示无法连接服务器,《生化危机5》黄金版无法联机怎么办?
- cad沿线插入块 lisp_我有一组数有十几万个坐标点,如何利用lisp程序快速导入CAD中,并可以快速处理!...
- 二进制转十六进制的详细步骤