今天是紀錄LeetCode解題的第五十三天
第五十三題題目:Given an integer array nums, find the subarray with the largest sum, and return its sum.
給定一個整數數組nums,找出總和最大的子陣列,並回傳它的總和值
這題的經典解法是Kadane's Algorithm,是一種用於解決最大子數組的動態規劃算法,我們要找到某一段連續區間,使得他的總和最大,首先我們要判斷當前數字nums[i]值不值得被放進子陣列當中,所以要比較curr_sum = max(nums[i],curr_sum + nums[i]),如果nums[i]比較大,表示nums[i]加到子陣列當中並沒有比較好(因為前面總和可能為負),那重新把nums[i]變成開頭開始找新的子陣列,那如果curr_sum + nums[i]比較大,那麼我們把nums[i]加入到子陣列當中繼續延伸此子陣列,接著比較max_sum = max(max_sum , curr_sum),紀錄更新最大子陣列總和
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
curr_sum = max_sum = nums[0]
for i in range(1,len(nums)):
curr_sum = max(nums[i],curr_sum + nums[i])#比較當前值和把當前值加前面總和誰大,如果當前值大,就重新當開頭,
max_sum = max(max_sum , curr_sum) #如果加到前面比較大,那麼把當前值加入繼續延伸該子陣列
return max_sum
nums = [-2,1,-3,4,-1,2,1,-5,4]
| i | nums[i] | curr_sum + nums[i] | nums[i] vs curr_sum+nums[i] | curr_sum | 說明 |
|---|---|---|---|---|---|
| 0 | -2 | – | – | -2 | 起點 |
| 1 | 1 | -2+1 = -1 | 1 > -1 → 重新開始 | 1 | 因為前面的和太低 |
| 2 | -3 | 1 + (-3) = -2 | -3 < -2 → -2 較大 → 延伸 | -2 | 延伸但結果變小 |
| 3 | 4 | -2 + 4 = 2 | 4 > 2 → 重新開始 | 4 | 單獨 4 比延續更好 |
| 4 | -1 | 4 + (-1) = 3 | 3 > -1 → 延伸 | 3 | 延伸但結果變小 |
| 5 | 2 | 3 + 2 = 5 | 5 > 2 → 延伸 | 5 | 延伸讓總和更大 |
| 6 | 1 | 5 + 1 = 6 | 6 > 1 → 延伸 | 6 | 延伸 |
| 7 | -5 | 6 - 5 = 1 | 1 > -5 → 延伸 | 1 | 還是延伸,但結果變小 |
| 8 | 4 | 1 + 4 = 5 | 5 > 4 → 延伸 | 5 | 延伸 |