给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
样例
给出数组[−2,2,−3,4,−1,2,1,−5,3]
,符合要求的子数组为[4,−1,2,1]
,其最大和为6
此题有两种解法,分别为动态规划算法和贪心算法
class Solution:
"""
@param nums: A list of integers
@return: A integer indicate the sum of max subarray
"""
#动态规划算法 时间复杂度高
def maxSubArray(self, nums):
# write your code here
maxSum = -float('inf')
L1 = []
for i in range(len(nums)):
L2 = []
L2.append(nums[i])
equal = sum(L2)
if maxSum < equal:
maxSum = equal
L1 = nums[i]
for j in range(i,len(nums)+1):
if nums[i:j] != []:
equal = sum(nums[i:j])
if maxSum < equal:
maxSum = equal
L1 = nums[i:j]
return maxSum
#依次寻找每一个元素的每种组合,然后与最大值进行比较,这种算法可视为穷举,时间复杂度较高,在此不做过多解释。
#L2的引入是为了解决列表只有一个元素时切片[0:0],sum([0:0])恒为0的问题。
#贪心法 时间复杂度较低,为O(n)
def maxSubArray1(self,nums):
MaxSum = sum(nums)
CurSum = 0
for i in range(len(nums)):
CurSum += nums[i]
#从下标为i的元素开始求和,如果大于MaxSum则替换
if CurSum > MaxSum:
MaxSum = CurSum
#如果前面的和小于0,那么加上下一个数一定大于此时的CurSum,所以舍弃此时的CurSum重新开始求和
if CurSum < 0:
CurSum = 0
return MaxSum
test = Solution()
L = [-2,2,-3,4,-1,2,1,-5,3]
print(test.maxSubArray1(L))
print(test.maxSubArray1([-1]))