python3 leecode之最大子序之和

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

示例:

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

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-subarray
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        max_sum = nums[0]
        for index, num in enumerate(nums):
            sum_num = 0
            for _ in nums[index:]:
                sum_num += _
                if sum_num > max_sum:
                    max_sum = sum_num
        return max_sum

結果:

執行用時 :8956 ms, 在所有 Python3 提交中擊敗了5.19%的用戶

內存消耗 :14.4 MB, 在所有 Python3 提交中擊敗了6.35%的用戶

思考:時間複雜度上來說屬於兩次遍歷,屬於O(n ^ 2)

先優化成O(n)

解題思路
對於每一個數,若前面的子數組和爲正,則加上前面的子數組作爲新的子數組,若爲負則保留自身作爲新的子數組;
每次遍歷都與當前最大子數組和做比較,保留較大者。代碼

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        maxSum = tempSum= nums[0]
        for num in nums[1:]:
            tempSum = max(num, num + tempSum)
            maxSum = max(maxSum, tempSum)
        return maxSum

 

DP  

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        for i in range(1, len(nums)):
            nums[i] = max(nums[i], nums[i] + nums[i-1])
        return max(nums)
"""
動態規劃。
最重要的是搞清楚 dp 數組所存儲元素的意義
存儲的不是從 0 到 i 這個範圍內所得到的最大的連續子數組的和,而是以 nums[i] 爲結尾的子數組所能達到的最大的和。

[-2,1,-3,4,-1,2,1,-5,4]
-2 + 1 = -1 小於1 所以不變
[-2, 1, -3, 4, -1, 2, 1, -5, 4]
-3 + 1 = -2 大於-3 所以替換成-2
[-2, 1, -2, 4, -1, 2, 1, -5, 4]
4 + -2 = -2 小於4 所以4不變
[-2, 1, -2, 4, -1, 2, 1, -5, 4]
-1 + 4 = 3  大於-1 所以替換成3
[-2, 1, -2, 4, 3, 2, 1, -5, 4]
2 + 3 = 5  大於2  所以替換成5
[-2, 1, -2, 4, 3, 5, 1, -5, 4]
1 + 5 = 6  大於1 所以替換成6
[-2, 1, -2, 4, 3, 5, 6, -5, 4]
-5 + 6 = -1 小於6 所以不變
[-2, 1, -2, 4, 3, 5, 6, 1, 4]
4 + 1 = 5 大於4 所以替換成5
[-2, 1, -2, 4, 3, 5, 6, 1, 5]
"""

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章