算法题中求解绝对值最值的技巧

本文介绍了在算法题中如何利用绝对值优化解决求解最值问题,以Leetcode 1131、1330和Google Kick Start Round A 2019 - Parcels为例,详细解析了如何通过拆解绝对值、二分查找和曼哈顿距离等技巧,高效求解最大值问题。
摘要由CSDN通过智能技术生成

引言

现在算法题中,有时会遇到求解绝对值最值的问题,比如给定一个数组,求解 a b s ∣ a i − a j ∣ abs|a_i - a_j| absaiaj的最大值。诸如此类问题,暴力解法是用 O ( n 2 ) O(n^2) O(n2)时间复杂度遍历 i , j i,j i,j。而一种常用优化是将绝对值拆开,比如 a b s ∣ a i − a j ∣ = m a x ( a i − a j , a j − a i ) abs|a_i - a_j| = max(a_i - a_j, a_j - a_i) absaiaj=max(aiaj,ajai),将问题拆成两个子问题,而每个子问题通过维护当前最小值,即 O ( n ) O(n) O(n)的时间可解出。最后通过 O ( 1 ) O(1) O(1)取二者最值即可。

下面分享三道利用此技巧解题的算法题,难度按升序排列。

Leetcode 1131

题意:
给定两个数组 a r r 1 arr1 arr1 a r r 2 arr2 arr2,让找两个下标 i i i j j j,使得 ∣ a r r 1 [ i ] − a r r 1 [ j ] ∣ + ∣ a r r 2 [ i ] − a r r 2 [ j ] ∣ + ∣ i − j ∣ |arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j| arr1[i]arr1[j]+arr2[i]arr2[j]+ij最大。

思路:
这里直接拆开三个绝对值,得到以下8个子问题:
本图来源于该题目的解答
然后我们把有关于下标 i i i和下标 j j j的项提出来放在一起,发现其实子问题只有以下四个:1&8;2&7;3&6;4&5(比如1和8,它们只不过把两个下标 i i i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值