最大和连续子数组
来源:互联网 发布:知乎 招聘 编辑:程序博客网 时间:2024/05/17 02:48
问题描述:给定一个数组A[0,1…n-1],求A的连续子数组,使该数组和最大
一. 暴力法
分析:首先初始化要求的最大值maxSum为A[0],然后定义三个索引i、j、k,然后三层循环:第一层i从0遍历到n-1,第二层j从i遍历到n-1,第三层k从i遍历到j,求出A[i]到A[j]之间的元素的和,然后和maxSum作比较并更新maxSum。
复杂度:时间复杂度为O(n^3),空间复杂度O(1)
代码:
二. 暴力法优化版本
分析:在第一个版本中,由于在第二层循环遍历过程中,如果j增加1变为j+1,k从i到j又要重复算一次,其实如果优化一下,将前面的从A[i]到[j]计算的和保留下来,而此时遍历到j+1时,只需要用前面的保留值再加上A[j+1]即得到了从i到j+1的部分子数组和。
复杂度:时间复杂度O(n^2),空间复杂度O(1)
代码:
三. 分治法
分析:讲数组从中间分开,则最大子数组要么完全在组半边数组,要么在有半边数组,要么跨立在中间的分界点上,如果完全在左右半边数组,用递归解决,如果跨立在分界点上,则一定包含左半边数组的最大后缀和右半边数组的最大前缀,因此可以从分界处向前后扫。
复杂度:时间复杂度O(nlogn),空间复杂度O(1)
代码:
四. sum数组法
分析:
设sum[i] = A[0] +A[1] + …… +A[i]
记S[i, j]为从子数组A[i],…..A[j]的和,则S[i, j] = sum[j] - sum[i-1],
如何求出最大的S[i, j],一个很直观的想法就是再遍历j的时候,我们使得sum[i-1]保持最小,即可得到在j在当前的最小子数组和,另外每遍历一次j,我们就像当前的到的S[i, j]和保留值作比较,并更新maxSum。
复杂度:时间复杂度O(n),空间复杂度O(n)
代码:
五. 动态规划
分析:
上面的算法将时间复杂度降到了O(n),却将空间复杂度升到了O(1),那么能不能讲空间复杂度降到O(1)呢 答案是肯定的。
不妨设all[i]为子数组A[0]…..A[i]的最大和,start[i]为子数组A[0]…..A[i]且包含A[i]的的最大和,那么如何求出all[i]呢,观察可得,all[i] = max{all[i-1], start[i-1] + A[i], A[i]}
复杂度:时间复杂度O(n),空间复杂度O(1)
代码:
似乎空间复杂度没降下来,但其实以上程序中的数组是没必要的。
- 连续子数组最大和
- 连续最大子数组和
- 连续子数组最大和
- 最大连续子数组和
- 连续子数组最大和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和。
- 最大子数组和(连续)
- 最大连续子数组和
- 最大连续子数组和
- 最大连续子数组和
- 数据库——设计过程
- rtsp 客户端请求视频的时候顺便填写输入用户名和密码的格式
- HDU 5901 Count primes(求1e11内素数个数模板)
- mysql基础日期处理(六)
- Android存储系统之源码篇
- 最大和连续子数组
- P1053 篝火晚会
- Error:Execution failed for task ':app:buildInfoDebugLoader'. > Exception while doing ...这样的错误点击来
- 山东省第八届acm省赛K题 贪心+dp
- response.getWriter()和out的区别
- Httpclient之网络请求数据
- java学习(二) -----对象的初始化和清理
- 递归算法经典例题
- Unity着色器基础