第三日

写代码的蓝胖子發表於2024-06-07

3. 最大子序列和問題

問題描述
給定一個整數序列,找出連續的子序列,使得該子序列的和最大,並返回這個最大和。

示例
輸入: [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

原本想法

  1. 開始考慮用動態規劃,用備忘錄方法,但是後來發現做不下去
  2. 後面考慮用雙指標,但是又沒有頭緒

GPT程式碼

def max_subarray_sum(nums):
    if not nums:
        return 0

    current_sum = max_sum = nums[0]

    for num in nums[1:]:
        current_sum = max(num, current_sum + num)
        max_sum = max(max_sum, current_sum)

    return max_sum

# 示例測試
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
print(max_subarray_sum(nums))  # 輸出: 6

我的理解
我理解為是一種求當前連續數字的最大和的貪心演算法,序列不斷吞併下一個數字。
吞併有兩種情況,一個是加上之前的結果,另一個是不加上,區別在於之前的結果是否大於0。
current_sum = max(num, current_sum + num)
所以我覺得這裡也可以改寫如下:

if current_sum > 0:
    current_sum += num
else:
    current_sum = num

最終要求的是整個計算過程中的最大序列,所以用max_sum記錄下最大結果
max_sum = max(max_sum, current_sum)