LSGO——LeetCode實戰 (數組系列)第53題:最大子序和 Maximum Subarray

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

示例:

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


進階:

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

解法一:

解題思路:我們注意到本題的關鍵是找出那個子序,我們思考,找出這個子序最關鍵的首尾的index,首先子序首的index我們並不容易得到,但是子序的尾index是很好得到的,我們假設已知首index,不斷疊加nums的元素並記錄在ans這個數組中,其中肯定會有一個最大值,而這個最大值對應的index就是尾index。接下來,我們思考如何得到首index,ans中記載的是疊加值,當這個爲負數的時候,那接下來疊加數肯定變小,所以我們以此時爲序列的首index,重新疊加數據。之後對整個ans求最大值就可以了。

第一步:新建存儲疊加值的ans數組,之後默認nums[0]爲子序列的首。

第二步:遍歷數組,將數組疊加到ans相應位置,如果ans的值爲負數,則重新記錄序列即0+當前元素值。如果ans非負,和當前nums的元素疊加。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """        
        ans =[]
        ans.append(nums[0])
        for i in range(1,len(nums)):
          temp =  0 if ans[i-1]<0 else ans[i-1]
          ans.append(nums[i] + temp)
        return max(ans)

 

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