最大子数组之和

题目:就是在给定的一串包含正数,负数的数组中,找出最大的子数组的和。
例如:
输入:1,-2,3,10,-4,7,2,-5

最大子数组和为18

经过尝试一共找到三种方法来实现操作。

一、暴力解法

       暴力解法的思想就是,便利所有的子数组比较大小,找打最大的就行了。思想很简单,代码也好写。但是这样的算法的时间复杂度为O(n^2)。对于大部分的OJ平台或者是笔试题都过不了,下面贴出代码。

二、分治法

       对于整个数组的最大子数组出现的位置来说无非就是三种情况,以中间元素为分解线,最大子数组全部在左半部,最大子数组全部在右半部,最大子数组包含中间元素三种情况。这种思想主要是利用递归的方法,若最大子数组全部在左半部或者右半部的话就可以继续递归下去再去细分。而中间部分是需要计算的,以中间元素为基准向左遍历找到最大的和,再向右遍历找到最大的和,最后相加就为中间部分最大子数组和。最终在三种情况中选出在最大的和就是最大子数组之和。具体可看代码中的注释。

这里实际上就是将整个数组以完全二叉树的形式分开来,从叶子节点开始向根的方向开始计算,每一棵子树的根节点都表示为该子树的最大子数组之和。故时间复杂度为O(nlogn);

三、动态规划

    用动态规划的思想来解决这道题是比较简单的。假定一个子问题是满足条件的,在此基础上去解决父问题。完成之后我们就从最小的子问题出发向上去处理。

假定已知A[1...n-1]的最大子数组之和,那么A[1...n]的最大子数组之和有两种情况,要么把n加进来,要么就不加。即要么是A[1..n-1]的最大子数组之和,要么是A[i...n]的最大子数组之和。那么比较两者就OK了。A[1...n-1]的最大子数组之和是清楚的,接下来的任务就是求的A[i...n]的最大子数组之和,这个数组最大的特点就是以n为右边界,如何去求呢?对于已知A[1...n-2]的最大子数组之和,求A[1...n-1]的最大子数组之和的问题来说,也需要知道A[i...n-1]的最大子数组和,那么我们现在就假设已知A[i...n-1]的最大子数组之和,这时A[i...n]的最大子数组之和就好求了。分为两种情况,要么只有A[n],要么不只有A[n]。那就时比较两者大小了,不只有A[n]的情况一定是A[i...n-1]加上A[n]。(当然如果规定最大子数组之和不能小于0的话就可以直接A[i...n-1]加上A[n]了)求得的A[i...n]的最大子数组之和与A[1...n-1]的最大子数组之和相比较大者为A[1...n]的最大子数组之和。

这种算法的时间复杂度无疑是O(n)。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值