当前位置:网站首页>【面试高频题】难度 1.5/5,二分经典运用题
【面试高频题】难度 1.5/5,二分经典运用题
2022-08-01 11:31:00 【宫水三叶的刷题日记】
题目描述
这是 LeetCode 上的 1818. 绝对差值和 ,难度为 中等。
Tag : 「二分」
给你两个正整数数组 nums1
和 nums2
,数组的长度都是 n
。
数组 nums1
和 nums2
的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)
的 总和(下标从 开始)。
你可以选用 nums1
中的 任意一个 元素来替换 nums1
中的 至多 一个元素,以 最小化 绝对差值和。
在替换数组 nums1
中最多一个元素 之后 ,返回最小绝对差值和。因为答案可能很大,所以需要对 取余 后返回。
|x|
定义为:
如果 ,值为 x
,或者如果 ,值为 -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
提示:
10^5$
二分
这是一道二分陈题,具体做法如下:
我们在进行处理前,先对 进行拷贝并排序,得到 数组。
然后 在遍历 和 计算总的差值 时,通过对 进行二分查找,找到最合适替换 的值。
具体的,当我们处理到第 位时,假设该位的原差值为 ,然后从 数组中通过二分找到最接近 的值,计算一个新的差值 (注意要检查分割点与分割点的下一位),如果满足 说明存在一个替换方案使得差值变小,我们使用变量 记下来这个替换方案所带来的变化,并不断更新 。
当整个数组被处理完, 存储着最优方案对应的差值变化,此时 即是答案。
代码:
class Solution {
int mod = (int)1e9+7;
public 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);
if (r + 1 < n) nd = Math.min(nd, Math.abs(sorted[r + 1] - b));
if (nd < x) max = Math.max(max, x - nd);
}
return (int)((sum - max) % mod);
}
}
时间复杂度:对 sorted
进行拷贝并排序的复杂度为 ;遍历处理数组时会一边统计,一边尝试二分,找最合适的替换数值,复杂度为 。整体复杂度为空间复杂度:使用 sorted
数组需要 的空间复杂度,同时排序过程中会使用 的空间复杂度;整体复杂度为
最后
这是我们「刷穿 LeetCode」系列文章的第 No.1818
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地
边栏推荐
- How to find out hidden computer software (how to clean up the computer software hidden)
- ACL 2022 | 文本生成的相关前沿进展
- 大众碰到点评的一个字体反爬,落地技术也是绝了
- (ES6 and above and TS) Map object to array
- JWT
- 【cartographer ros】10: Delay and error analysis
- The four methods of judging JS data type
- 数字化转型实践:世界级2B数字化营销的方法框架
- Audio and Video Technology Development Weekly | 256
- LeakCanary如何监听Service、Root View销毁时机?
猜你喜欢
收藏|机械工程师面试常问问题
Pytest e-commerce project combat (below)
【公开课预告】:超分辨率技术在视频画质增强领域的研究与应用
Promise学习(四)异步编程的终极解决方案async + await:用同步的方式去写异步代码
Small application project works WeChat gourmet recipes applet graduation design of finished product (1) the development profile
数字化转型实践:世界级2B数字化营销的方法框架
如何利用DevExpress控件绘制流程图?看完这篇文章就懂了!
Drawing arrows of WPF screenshot control (5) "Imitation WeChat"
【公开课预告】:超分辨率技术在视频画质增强领域的研究与应用
.NET analyzes the LINQ framework in depth (three: the elegant prelude of LINQ)
随机推荐
Android Security and Protection Policy
[Open class preview]: Research and application of super-resolution technology in the field of video quality enhancement
如何成功通过 CKA 考试?
xss-labs靶场挑战
(ES6 and above and TS) Map object to array
冰冰学习笔记:gcc、gdb等工具的使用
SCHEMA解惑
力扣解法汇总1374-生成每种字符都是奇数个的字符串
表达式引擎在转转平台的实践
Jenkins安装插件遇到的问题
pgAdmin 4 v6.12 发布,PostgreSQL 开源图形化管理工具
Promise学习(二)一篇文章带你快速了解Promise中的常用API
The four methods of judging JS data type
Mini Program Graduation Works WeChat Food Recipes Mini Program Graduation Design Finished Products (2) Mini Program Functions
Hot review last week (7.25 7.31)
监视网络连接的ss命令
【钛晨报】国家统计局:7月制造业PMI为49%;玖富旗下理财产品涉嫌欺诈,涉及390亿元;国内航线机票燃油附加费8月5日0时起下调
WPF 截图控件之绘制箭头(五)「仿微信」
Flutter Widget 如何启用和屏蔽点击事件
图解MySQL内连接、外连接、左连接、右连接、全连接......太多了