LeetCode刷題之路:53. 最大子序和
阿新 • • 發佈:2020-12-31
技術標籤:力扣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] 為負數, 所有我們再更新已經找到的最大和時要更新為 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