编程技术问题:寻找数组分割点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:极端情况法(更快的小技巧)
其实你会发现,最大的差值只会出现在几种极端分割点:
- 分割点在第一个元素之后(L只有第一个元素)
- 分割点在最后一个元素之前(R只有最后一个元素)
- 分割点在全局最大值的前一个位置(R包含全局最大值,L是前面所有元素)
- 分割点在全局最大值的后一个位置(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
相关产品推荐
相关产品推荐

