← 返回博客列表
Google

Google VO 真题:找到最大子数组和的数对 - O(n) 前缀和解法

2026-01-24

问题描述

给定一个整数数组,找到两个不相交的子数组,使得它们的子数组和之和最大。

示例:

输入: [1, -2, 3, 4, -5, 8]
输出: 15
解释: 子数组 [3, 4] (和为7) 和 [8] (和为8),总和为15

解题思路

方法一:暴力解法 O(n²)

最直接的想法是枚举所有可能的两个子数组组合,计算它们的和。

def maxSumTwoPairs(arr):
    n = len(arr)
    max_sum = float('-inf')
    
    # 枚举第一个子数组
    for i in range(n):
        sum1 = 0
        for j in range(i, n):
            sum1 += arr[j]
            
            # 枚举第二个子数组(必须在第一个之后)
            for k in range(j + 1, n):
                sum2 = 0
                for l in range(k, n):
                    sum2 += arr[l]
                    max_sum = max(max_sum, sum1 + sum2)
    
    return max_sum

时间复杂度: O(n⁴)
空间复杂度: O(1)

方法二:前缀和优化 O(n²)

使用前缀和数组,可以在 O(1) 时间内计算任意子数组的和。

def maxSumTwoPairs(arr):
    n = len(arr)
    
    # 构建前缀和数组
    prefix = [0] * (n + 1)
    for i in range(n):
        prefix[i + 1] = prefix[i] + arr[i]
    
    def getSum(i, j):
        # 计算 arr[i:j+1] 的和
        return prefix[j + 1] - prefix[i]
    
    max_sum = float('-inf')
    
    # 枚举分割点
    for split in range(n):
        # 第一个子数组在 [0, split]
        # 第二个子数组在 [split+1, n-1]
        
        max_sum1 = float('-inf')
        for i in range(split + 1):
            for j in range(i, split + 1):
                max_sum1 = max(max_sum1, getSum(i, j))
        
        max_sum2 = float('-inf')
        for i in range(split + 1, n):
            for j in range(i, n):
                max_sum2 = max(max_sum2, getSum(i, j))
        
        if max_sum1 != float('-inf') and max_sum2 != float('-inf'):
            max_sum = max(max_sum, max_sum1 + max_sum2)
    
    return max_sum

时间复杂度: O(n²)
空间复杂度: O(n)

方法三:动态规划 O(n) ⭐ 最优解

关键观察:对于每个分割点,我们需要快速找到左边的最大子数组和和右边的最大子数组和。

使用两个 DP 数组:

def maxSumTwoPairs(arr):
    n = len(arr)
    if n < 2:
        return 0
    
    # left_max[i] = arr[0:i+1] 中的最大子数组和
    left_max = [0] * n
    max_ending_here = arr[0]
    left_max[0] = arr[0]
    
    for i in range(1, n):
        max_ending_here = max(arr[i], max_ending_here + arr[i])
        left_max[i] = max(left_max[i - 1], max_ending_here)
    
    # right_max[i] = arr[i:n] 中的最大子数组和
    right_max = [0] * n
    max_ending_here = arr[n - 1]
    right_max[n - 1] = arr[n - 1]
    
    for i in range(n - 2, -1, -1):
        max_ending_here = max(arr[i], max_ending_here + arr[i])
        right_max[i] = max(right_max[i + 1], max_ending_here)
    
    # 枚举分割点,找最大和
    max_sum = float('-inf')
    for i in range(n - 1):
        max_sum = max(max_sum, left_max[i] + right_max[i + 1])
    
    return max_sum

时间复杂度: O(n)
空间复杂度: O(n)

核心要点

  1. Kadane 算法:用于在 O(n) 时间内找到最大子数组和
  2. 前缀和思想:快速计算任意区间的和
  3. 分治策略:将问题分为左右两部分,分别求最优解
  4. DP 状态定义:清晰的状态转移方程是关键

面试技巧

常见陷阱

❌ 忘记两个子数组必须不相交
❌ 没有正确处理 Kadane 算法的初始化
❌ 分割点的边界条件错误
✅ 使用 DP 预处理左右最大值,确保 O(n) 时间复杂度


🚀 想在 VO / OA 中脱颖而出?oavoservice 提供全方位面试护航服务

无论是 OA 代刷、VO 实时辅助,还是面试助攻,我们的北美 CS 专家都能为你提供实时提示和思路,效果远超 AI。

代面试、SDE 代面、FAANG 代面?没问题。

通过摄像头转接与变声技术,我们的专业团队帮你完成全程面试。提前模拟测试、配合默契,你的脸合成我们的声音,现场表现自信自然,无缝衔接。

全套包过、Offer 包拿、快速入职大厂。

无论是 OA、面试、还是签约谈判,我们全程护航,直到你拿到满意 Offer。

服务采用预付少量定金、拿到 Offer 后支付尾款模式,让你无后顾之忧。

We consistently provide professional online assessment and interview assistance services for major tech companies like Google, providing guaranteed perfect scores and successful outcomes.

👉 立即添加微信:Coding0201

锁定你的 Google VO Offer 机会!