You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编程技术问题:寻找数组分割点K使|max(L)-max(R)|最大化

解决数组分割最大化|max(L)-max(R)|的问题

嘿,这个问题我之前碰到过类似的,核心就是找到能让两边最大值差的绝对值最大的分割点。咱们先把思路掰碎了说,再看具体怎么实现~

核心思路

要让|max(L) - max(R)|最大,本质上就是要让其中一边的最大值尽可能大,另一边的最大值尽可能小。但因为分割点必须把数组分成非空的两部分,所以不能直接拿全局最大值和全局最小值硬凑(除非它们刚好能被分割到不同部分)。

最稳妥且高效的思路是先预处理出两个辅助数组:

  • 前缀最大值数组:prefix_max[i]表示从数组开头到第i个元素的最大值
  • 后缀最大值数组:suffix_max[i]表示从第i个元素到数组末尾的最大值

有了这两个数组,我们只需要遍历所有合法的分割点K(K是R部分的首个元素,也就是L是[0..K-1],R是[K..n-1],K的范围是1到n-1),计算每个K对应的|prefix_max[K-1] - suffix_max[K]|,取其中的最大值就行。

这种方法时间复杂度是O(n),空间复杂度O(n),如果想省空间,还可以优化成O(1)的版本。

代码实现(Python)

方法1:直观版(预处理前缀/后缀数组)

这个版本最容易理解,适合新手或者需要清晰逻辑的场景:

def max_abs_diff(arr):
    n = len(arr)
    if n < 2:
        return 0  # 数组长度不够,无法分割,返回0(可根据题目要求调整)
    
    # 构建前缀最大值数组:prefix_max[i] = max(arr[0..i])
    prefix_max = [0] * n
    prefix_max[0] = arr[0]
    for i in range(1, n):
        prefix_max[i] = max(prefix_max[i-1], arr[i])
    
    # 构建后缀最大值数组:suffix_max[i] = max(arr[i..n-1])
    suffix_max = [0] * n
    suffix_max[-1] = arr[-1]
    for i in range(n-2, -1, -1):
        suffix_max[i] = max(suffix_max[i+1], arr[i])
    
    max_diff = 0
    # 遍历所有合法分割点,计算差值并更新最大值
    for k in range(1, n):
        current_diff = abs(prefix_max[k-1] - suffix_max[k])
        if current_diff > max_diff:
            max_diff = current_diff
    
    return max_diff

方法2:极端情况法(更快的小技巧)

其实你会发现,最大的差值只会出现在几种极端分割点:

  1. 分割点在第一个元素之后(L只有第一个元素)
  2. 分割点在最后一个元素之前(R只有最后一个元素)
  3. 分割点在全局最大值的前一个位置(R包含全局最大值,L是前面所有元素)
  4. 分割点在全局最大值的后一个位置(L包含全局最大值,R是后面所有元素)

我们只需要计算这几个情况的差值,取最大的就行,空间复杂度直接O(1):

def max_abs_diff_extreme(arr):
    n = len(arr)
    if n < 2:
        return 0
    
    global_max = max(arr)
    max_idx = arr.index(global_max)
    
    # 情况1:K=1,L只有第一个元素
    diff1 = abs(arr[0] - max(arr[1:]))
    # 情况2:K=n-1,R只有最后一个元素
    diff2 = abs(max(arr[:n-1]) - arr[-1])
    # 情况3:K=max_idx,R包含全局最大值(如果全局最大值不在第一个位置)
    diff3 = -float('inf')
    if max_idx > 0:
        diff3 = abs(max(arr[:max_idx]) - global_max)
    # 情况4:K=max_idx+1,L包含全局最大值(如果全局最大值不在最后一个位置)
    diff4 = -float('inf')
    if max_idx < n-1:
        diff4 = abs(global_max - max(arr[max_idx+1:]))
    
    # 取所有有效情况的最大值
    return max(diff1, diff2, diff3, diff4)

验证示例

比如测试数组[1,5,2,3]:

  • 情况1差值是|1-5|=4,情况2是|5-3|=2,情况3是|1-5|=4,情况4是|5-3|=2,最大值是4,正确。

再比如数组[3,1,4,2]:

  • 情况1差值是|3-4|=1,情况2是|4-2|=2,情况3是|3-4|=1,情况4是|4-2|=2,最大值是2,正确。

总结

如果是日常开发,方法1最直观,不容易出错;如果处理超大数组,方法3效率最高,因为只需要几次最大值计算,遍历次数极少。

内容的提问来源于stack exchange,提问作者user8446864

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:50:00