問題描述
給定一個整數陣列,找到兩個不相交的子陣列,使得它們的子陣列和之和最大。
示例:
輸入: [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 陣列:
left_max[i]:arr[0:i+1] 中的最大子陣列和right_max[i]:arr[i:n] 中的最大子陣列和
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)
核心要點
- Kadane 演算法:用於在 O(n) 時間內找到最大子陣列和
- 前綴和思想:快速計算任意區間的和
- 分治策略:將問題分為左右兩部分,分別求最優解
- DP 狀態定義:清晰的狀態轉移方程是關鍵
面試技巧
- 先從暴力解法開始,逐步優化
- 明確說明時間和空間複雜度
- 處理邊界情況(陣列長度 < 2)
- 考慮負數的情況
- 可以手寫幾個測試用例驗證
常見陷阱
❌ 忘記兩個子陣列必須不相交
❌ 沒有正確處理 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 機會!