【leetcode100】最大子数组和

发布于:2024-11-28 ⋅ 阅读:(17) ⋅ 点赞:(0)

1、题目描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。

示例 1:

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

输出:6

解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

2、初始思路

2.1 思路

使用前缀和进行计算,通过前缀和数组的最大值减去最小值来计算最大子数组和。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        presum = (len(nums)+1)*[0]
        presum[0] = 0
        max_sum = 0
        sum_i = 0
        for i in range(len(nums)):
            sum_i += nums[i]
            presum[i+1] = sum_i
        return max(presum) - min(presum)

2.2 犯错点

这样处理并不正确,因为前缀和考虑的是前n个数组总体的和,通过前缀和数组的最大值减去最小值来计算最大子数组和不能考虑到其位置的正确性。

正确使用如下,但运行时间较长。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        presum = (len(nums)+1)*[0]
        presum[0] = 0
        sum_i = 0
        for i in range(len(nums)):
            sum_i += nums[i]
            presum[i+1] = sum_i
        print(presum)
        min_sum = 0
        max_sum = float('-inf')
        for num in presum[1:]:
            max_sum = max(max_sum,num-min_sum)
            min_sum = min(min_sum,num)
        return max_sum

3 优化算法

3.1 思路

使用动态规划,当前面产生负和时,影响整个数组的增益,抛弃负和,重新计算和。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0  # 如果数组为空,返回0

        current_sum = 0
        max_sum = float('-inf')  # 初始化最大和为负无穷

        for num in nums:
            current_sum += num
            if current_sum > max_sum:
                max_sum = current_sum
            if current_sum < 0:
                current_sum = 0

        return max_sum