1. 程式人生 > 其它 >LeetCode刷題之路:53. 最大子序和

LeetCode刷題之路:53. 最大子序和

技術標籤:力扣LeetCodeleetcode演算法python資料結構最大子序和

給定一個整數陣列 nums ,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。

示例:

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

如果你已經實現複雜度為 O(n) 的解法,嘗試使用更為精妙的分治法求解。

#最直觀的思路
直接遍歷整個列表,找出最大值。
程式碼講解:設定兩個變數分別記錄當前的和以及已經找到的最大和。
然後判斷當前的和加上第i個數是否大於第i個數,
如果大於則第i個數對於最大和可能是有收益的,

則將當前的和更新為:nums[i] + last_max
但是這裡需要注意 有可能 nums[i] < last_max + nums[i] < last_max
也就是 nums[i] 為負數, 所有我們再更新已經找到的最大和時要更新為 max(max_sum, last_max)

如果當前的和加上第i個數小於第i個數,則說明當前和是個負數
則最大和要從第i個數重新開始算起了,前面的全部丟去。
需要注意的是要將最大和更新為 max(nums[i], max_sum),這是為了防止nums[i]也是一個負數
而當前和則直接變為nums[i]即可


class Solution:
    def maxSubArray(
self, nums: List[int]) -> int: last_max = nums[0] #記錄當前的和 max_sum = last_max #記錄最大的和 for i in range(1, len(nums)): if last_max + nums[i] > nums[i]: last_max = nums[i] + last_max max_sum = max(max_sum, last_max) # print(max_sum)
else: max_sum = max(nums[i], max_sum, last_max) last_max = nums[i] return max_sum