Leetcode 1031:绝对值表达式的最大值(超详细的解法!!!)

给你两个长度相等的整数数组,返回下面表达式的最大值:

|arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|

其中下标 ij 满足 0 <= i, j < arr1.length

示例 1:

输入:arr1 = [1,2,3,4], arr2 = [-1,4,5,6]
输出:13

示例 2:

输入:arr1 = [1,-2,-5,0,10], arr2 = [0,-2,-1,-7,-4]
输出:20 

提示:

  • 2 <= arr1.length == arr2.length <= 40000
  • -10^6 <= arr1[i], arr2[i] <= 10^6

解题思路

与这个问题类似的问题

字节跳动2019笔试:国庆旅行(超详细的解法!!!)

Leetcode 1014:最佳观光组合(超详细的解法!!!)

Leetcode 121:买卖股票的最佳时机(最详细的解法!!!)

首先我们要将上面的式子整理一下,根据不同情况,我们可以得到下面的四个式子

  • ( a 1 [ i ] + a 2 [ i ] + i ) − ( a 1 [ j ] + a 2 [ j ] + j ) (a_1[i]+a_2[i]+i)-(a_1[j]+a_2[j]+j) (a1[i]+a2[i]+i)(a1[j]+a2[j]+j)
  • ( a 1 [ i ] − a 2 [ i ] + i ) − ( a 1 [ j ] − a 2 [ j ] + j ) (a_1[i]-a_2[i]+i)-(a_1[j]-a_2[j]+j) (a1[i]a2[i]+i)(a1[j]a2[j]+j)
  • ( a 2 [ i ] − a 1 [ i ] + i ) − ( a 2 [ j ] − a 1 [ j ] + j ) (a_2[i]-a_1[i]+i)-(a_2[j]-a_1[j]+j) (a2[i]a1[i]+i)(a2[j]a1[j]+j)
  • ( − a 1 [ i ] − a 2 [ i ] + i ) − ( − a 1 [ j ] − a 2 [ j ] + j ) (-a_1[i]-a_2[i]+i)-(-a_1[j]-a_2[j]+j) (a1[i]a2[i]+i)(a1[j]a2[j]+j)

我们遍历数组arr1的过程中,必然可以确定出右边式子(右边括号部分)的最小值是谁,那么整个式子的最大值就可以通过当前遍历到位置的左括号值减去右边式子的最小值得到(这里的思想和前面的类似问题中是一致的)。

class Solution:
    def maxAbsValExpr(self, arr1: List[int], arr2: List[int]) -> int:
        res, n = 0, len(arr1)
        for a, b in (1, 1), (1, -1), (-1, -1), (-1, 1):
            right = a * arr1[0] + b * arr2[0]
            for i in range(n):
                left = a * arr1[i] + b * arr2[i] + i
                res = max(res, left - right)
                right = min(left, right)
        return res

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

你可能感兴趣的:(Problems,leetcode解题指南)