算法学习-连续子数组求和最大值

来源:互联网 发布:linux查看当前shell 编辑:程序博客网 时间:2024/05/20 07:19

1.最笨的办法-穷举法

思路就是,取出所有可能的子数组,即找出所有可能的0≤i≤j≤n,然后求出数组从i到j的所有数的和再对比,这样的方法时间复杂度较高,python实现如下:

class Solution(object):    def maxSubArray(self, nums):        """        :type nums: List[int]        :rtype: int        """        n=len(nums);        ans = -100000000000;        for i in range(0,n):            for j in range(i,n):                sums =sum(nums[i:j+1]);                ans=max(ans,sums)        return ans

提示超时,最终执行的输入如下:

此时的时间复杂度为O(n^3)

2.第一次优化:

这一步求和的时候,每次没有必要从i到j完整求和,只要存储了上一次求和的结果,之后只要在前面求和的基础上继续累加就可以。

具体方法就是,把sums=0在j循环之前声明,j进行循环时,每次求和是在前一次求和的基础上再加上num[j]:

class Solution(object):    def maxSubArray(self, nums):        """        :type nums: List[int]        :rtype: int        """        n=len(nums);        ans = -100000000000;        for i in range(0,n):            sums = 0            for j in range(i,n):                sums += nums[j];                ans=max(ans,sums)        return ans

此时超时的结果为,有提升:

时间复杂度此时为O(n^2)

0 0