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

引言

现在算法题中,有时会遇到求解绝对值最值的问题,比如给定一个数组,求解 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<

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值