1. 题目
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
2. 解答
python3
思路:只有之前的序列和为正数时,才进行累加,否则之前的清零,只算当前的元素。也有可能当前元素是负数,而之前的子序和为正数,那么新的子序和是小于之前的子序和的,所以需要每一次算完之后都更新最大值。
class Solution(object): def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums) == 1: return nums[0] local, max_sum = 0, -2**31 for e in nums: if local > 0: local += e else: local = e if local > max_sum: max_sum = local return max_sum nums = [-2,1,-3,4,-1,2,1,-5,4] s = Solution().maxSubArray(nums) print(s)
3. 优答
扫描二维码关注公众号,回复:
1614242 查看本文章
python3
方法1:思路参见博客https://blog.csdn.net/zl87758539/article/details/51676108
class Solution(object): def maxSubArray(self, nums): l = g = -2**31 for n in nums: l = max(n, l+n) g = max(l, g) return g
方法2:空间开销比方法1大,思路是一样的。
class Solution: def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int """ length=len(nums) for i in range(1,length): #当前值的大小与前面的值之和比较,若当前值更大,则取当前值,舍弃前面的值之和 subMaxSum=max(nums[i]+nums[i-1],nums[i]) nums[i]=subMaxSum#将当前和最大的赋给nums[i],新的nums存储的为和值 return max(nums)
方法3:思路是一样的,但是考虑了一种特殊情况,即列表中所有元素都为负数的情况。这是目前几个方法中的最优解。
class Solution(object): def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int """ if max(nums) < 0: return max(nums) global_max, local_max = 0, 0 for x in nums: local_max = max(0, local_max + x) global_max = max(global_max, local_max) return global_max