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

如何将数组分段最小差值函数优化至O(N)时间复杂度?

嘿,我来帮你搞定这个性能优化的问题!你的O(N²)复杂度问题根源肯定是每次计算分割点的左右和时都重复遍历了数组,咱们直接用前缀累加+总和推导的思路就能把时间压到O(N),完全不用子循环。

核心优化思路:避免重复求和

原来的代码应该是对每个分割点P,都分别循环计算左半部分(0到P-1)和右半部分(P到N-1)的和,这就导致了嵌套循环的O(N²)复杂度。优化的关键是利用「总和与前缀和的关系」,只做两次线性遍历:

  • 第一步:先算一次数组的总总和total_sum,这一步只需要遍历数组一次,O(N)时间。
  • 第二步:遍历数组时维护一个左半部分累加和left_sum,每遍历到一个元素(对应分割点P=i+1),右半部分的和直接用total_sum - left_sum推导出来,不用再循环计算。同时实时计算当前分割的差值,记录最小的那个。
具体实现示例(伪代码)
def find_min_split_diff(arr):
    total_sum = sum(arr)
    left_sum = 0
    min_diff = float('inf')
    
    # 注意:分割点P要满足0<P<N,所以左半部分最多到倒数第二个元素
    for num in arr[:-1]:
        left_sum += num
        current_diff = abs(left_sum - (total_sum - left_sum))
        if current_diff < min_diff:
            min_diff = current_diff
    
    return min_diff
为什么这个方法是O(N)?

整个过程只做了两次线性遍历:一次计算总和,一次遍历找最小差值,没有任何嵌套循环。所有求和操作都在单次遍历中完成,完全避免了重复计算——这就是性能提升的核心。

举个直观的例子:假设数组是[1,2,3,4],总和是10。遍历到第一个元素1时,left_sum=1,右和是9,差值8;遍历到2时left_sum=3,右和7,差值4;遍历到3时left_sum=6,右和4,差值2。全程只遍历数组两次,就得到了最小差值2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:55:55