天天看點

<LeetCode天梯>Day039 最大子序和(動态規劃) | 初級算法 | Python

以下為我的天梯積分規則:

每日至少一題:一題積分+10分

若多做了一題(或多一種方法解答),則當日積分+20分(+10+10)

若做了三道以上,則從第三題開始算+20分(如:做了三道題則積分-10+10+20=40;做了四道題則積分–10+10+20+20=60)

初始分為100分

若差一天沒做題,則扣積分-10分(周六、周日除外注:休息)

堅持!!!

初級算法

刷題目錄

動态規劃

<LeetCode天梯>Day039 最大子序和(動态規劃) | 初級算法 | Python
<LeetCode天梯>Day039 最大子序和(動态規劃) | 初級算法 | Python

題幹

給你一個整數數組 nums ,請你找出一個具有最大和的連續子數組(子數組最少包含一個元素),傳回其最大和。

子數組 是數組中的一個連續部分。

示例1:

輸入:nums = [-2,1,-3,4,-1,2,1,-5,4]

輸出:6

解釋:連續子數組 [4,-1,2,1] 的和最大,為 6 。

示例2:

輸入:nums = [1]

輸出:1

示例3:

輸入:nums = [5,4,-1,7,8]

輸出:23

分析:

動态規劃,确定狀态轉移函數,我們隻需要将目前的前一個元素的最大子序和是正數,則相加起來;否則将目前元素作為最大子序和。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n = len(nums)
        dp = [0]*n      # dp[i]表示第i個元素的最大子序和
        # 邊界條件
        dp[0] = nums[0]     # 第一個元素的最大子序和為本身
        # 周遊
        for i in range(1, n):
            if dp[i-1] > 0:
                dp[i] = dp[i-1] + nums[i]       # 若上一個數的最大子序和為正數,則相加
            else:
                dp[i] = nums[i]     # 若前一個數為負,則目前作為最大子序和
        return max(dp)      
<LeetCode天梯>Day039 最大子序和(動态規劃) | 初級算法 | Python