← 返回博客列表
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, guaranteeing perfect scores and successful outcomes.

👉 立即添加微信:Coding0201

鎖定你的 Google VO Offer 機會!