算法学习-连续子数组求和最大值
2017-02-26 20:53
204 查看
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)
3.第二次优化:贪心算法
计算某串子数组A[i:j],一旦发现sum(A[i:j])<0,那么后面A[i:j+1]之后就无需再计算了,这一组结果一定不满足最大(已经算出了负数,完全可以把这组负数结果抛弃掉,从下一个下标开始算),因此此时应该直接开始算从A[j+1]开始的子数列:class Solution(object): def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int """ n=len(nums); ans = -100000000000; sums = 0; for i in range(0,n): sums = sums+nums[i] ans = max(sums,ans) if sums <= 0 : sums = 0; return ans
结果通过!事实上,此次的时间复杂度只有O(n)
相关文章推荐
- 算法学习-连续子数组求和最大值
- 算法学习-连续子数组求和最大值
- 算法学习-最大连续子数组
- 【算法导论学习-007】最大子数组和问题(Maximum subarray problem)
- 【算法学习】最大子数组问题的分治法求解
- 算法学习--3 最大子数组和以及进阶问题
- (算法)和为0的最大连续子数组
- 连续子数组最大和问题(能够处理全是负数,返回子数组的起止索引的O(N)算法)
- 算法学习-零子数组,最大连续子数组
- 算法学习-数组的最大间隔
- 给定一个由非负整数和整数m组成的数组,可以将该数组分成m个非空的连续子数组。 写一个算法来最小化这些m个子阵列之间的最大和。
- 算法学习二----求子数组的最大和
- [算法导论]练习4.1-5最大连续子数组问题
- 《github一天一道算法题》:分治法求数组最大连续子序列和
- 【算法拾遗】三种方法求连续子数组的最大和
- 每日一算法:求连续子数组和的最大值
- 算法笔记_043:最大连续子数组和(Java)
- [动态规划]最大连续子数组和的四种算法
- 数组复习及Scanner类 ,及对最大值,最小值、平均数、求和等基本算法的理解