分治法最大子數組

分治法(Divide and Conquer)是一種常用的算法設計策略,用於解決可以分解為若干個子問題的任務。在處理最大子數組問題時,分治法可以幫助我們有效地找到數組中最大的連續子數組。

最大子數組問題可以表述為:給定一個數組,找到其中元素總和最大的連續子數組。例如,對於數組 [2, 1, -1, 4, 3],最大的連續子數組是 [4, 3],其總和為 7

使用分治法解決最大子數組問題的步驟如下:

  1. 分治步驟

    • 將原始數組 nums 分成兩部分,分別是左半部分 left 和右半部分 right
    • 使用分治法分別在 leftright 中找到最大的連續子數組。
    • leftright 的最大子數組與 nums 的中間元素 mid 進行比較。如果 midleftright 的最大子數組相連,則更新最大子數組。
  2. 遞歸步驟

    • 如果 leftright 為空,則返回另一部分的最大子數組。
    • 如果 leftright 都不為空,則將 leftright 的最大子數組與包含 mid 的子數組進行比較,並更新最大子數組。

以下是一個簡單的Python實現:

def maxSubArray(nums):
    def helper(nums, l, r):
        if l == r:
            return nums[l]
        else:
            mid = (l + r) // 2
            left_max = helper(nums, l, mid)
            right_max = helper(nums, mid + 1, r)
            mid_max = maxSubArray(nums[mid:mid + 1])
            return max(left_max, right_max, mid_max + nums[mid])
    return helper(nums, 0, len(nums) - 1)

# 示例
nums = [2, 1, -1, 4, 3]
print(maxSubArray(nums))  # 應該輸出7

這個算法的時間複雜度為 O(n log n),因為它使用了遞歸和分治法。空間複雜度為 O(n),因為在遞歸過程中最多需要 n 層的遞歸堆棧。

請注意,這個算法是基於分治法的一般框架,實際上還有更高效的算法來解決最大子數組問題,比如Kadane's algorithm,它的時間複雜度為 O(n)