【DP】53. Maximum Subarray

问题描述:

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

解题思路:

简单的动态规划题目:

  • 创建 dp[len(nums)],其中 dp[i] 表示以 i 位置结尾的数的最大子段和
  • 状态转移方程:dp[i] = max(nums[i], dp[i-1] + nums[i])
  • 最后,max(dp) 就是最终的答案。

时间复杂度为O(n),空间复杂度也为O(n)。

Python3 实现:

class Solution:
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0:
            return 0
        dp = [0] * len(nums)
        dp[0] = nums[0]
        for i in range(1, len(nums)):
            dp[i] = max(nums[i], dp[i-1] + nums[i])
        return max(dp)
补充:

最小子段和问题可以转化为最大字段和问题,只需要将列表中的元素全部取反,然后求最大字段和,再将结果取反即可。

改进——解题思路2:

可以不用列表,只需要两个变量,一个记录局部最大子段和,一个记录全局最大子段和。当局部最大子段和大于0时,就累积当前的数字;否则,就把当前的数字作为当前最大子段和。每次循环判断之后,还要更新最大子段和的值。这样时间复杂度仍为 O(n),但空间复杂度将为 O(1)。

Python3 实现2:

# 动态规划
class Solution:
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        ret = nums[0]  # 全局最大
        tem = 0  # 局部最大
        for i in range(len(nums)):
            if tem > 0:
                tem += nums[i]
            else:
                tem = nums[i]
            ret = max(ret, tem)
        return ret

a = [-2,1,-3,4,-1,2,1,-5,4]
b = Solution()
print(b.maxSubArray(a))  # 6 # [4,-1,2,1]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容