【Leetcode】53. Maximum Subarray
求数组的最大子数组的和,经典的DP问题

方法1 DP

很容易想到递推方程:

dp[i] = dp[i-1] + nums[i] if dp[i-1]>0 else nums[i]
class Solution1:
    def maxSubArray(self,nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        dp = [0 for i in range(len(nums))]
        res = -float('inf')
        for i in range(len(nums)):
            if i == 0:
                dp[i] = nums[0]
            else:
                dp[i] = max(nums[i],dp[i-1]+ nums[i])
            res = max(dp[i], res)
        return res

如果不用数组的形式,可以写成这样

class Solution2:
    def maxSubArray(self,nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        curr_sum = 0
        res = -float('inf')
        for i in range(nums):
            if curr_sum <=0:
                curr_sum = nums[i]
            else:
                curr_sum += nums[i]
            res = max(res, curr_sum)
        return res

方法2 Greedy

顺序遍历数组,假设到当前位置数组的总和为sumer,那么只要找到当前位置子数组和最小的值miner,用sumer - miner即可,不断更新sumer 和 miner即可求出我们需要的值

class Solution3:
    def maxSubArray(self, nums):
        sumer, miner,res = 0,0,nums[0]
        for i in range(len(nums)):
            sumer += nums[i]
            res = max(sumer - miner, res)
            if sumer < miner:
                miner = sumer
        return res

相关文章: