最大连续子序列和
来源:互联网 发布:java基本语法 编辑:程序博客网 时间:2024/06/05 02:53
最大连续子序列和
问题
对于形如:int arr[] = { 1, -5, 3, 8, -9, 6 };的数组,求出它的最大连续子序列和。
若数组中全部元素都是正数,则最大连续子序列和即是整个数组。
若数组中全部元素都是负数,则最大连续子序列和即是空序列,最大和就是0。
方法一
用sum[i,j]表示arr[i]到arr[j]的和,则显然可以通过枚举(i<=j),求出所有的和。
时间复杂度O(n^3)
方法二-a
方法一中,有重复计算的嫌疑,显然sum[i,j]依赖于sum[i,j-1]:sum[i,j]=sum[i,j-1]+arr[j];所以不必每次都arr[i]+arr[i+1]……arr[j]才可得到sum[i,j],只需利用sum[i,j]和sum[i,j-1]的关系即可较少运算。这就是:对过程的解进行记录,以防以后用到,从而减少重复求解。
时间复杂度O(n^2)
方法二-b
对方法一的另一种优化是:先记录sum[0,j](j=0,1,……,n-1),而sum[i,j]=sum[0,j]-sum[0,i-1];这同样可以减少一层循环。
时间复杂度依然是O(n^2)。
为防止越界,使用sum[i,j]=sum[0,j]-sum[0,i]+arr[i];代替sum[i,j]=sum[0,j]-sum[0,i-1];
运用动态规划的思想,先把整个序列等分成两部分:arr[l,m]、arr[m+1,u](l->lower下界,u->upper上界)。
于是,最大和子序列只可能出现在三处:
- arr[l,m]
- arr[m+1,u]
- 最大和子序列跨越arr[m]
对于1,2是相同的子问题,可递归求解。对于3可使用简单的算法直接求解。
可以证明它的时间复杂度是O(nlogn)
方法四
该算法只需遍历一次arr,即可得出结果。
逻辑是:
arr[0,i](i=0,1,...,n-1)的连续子序列有很多,特别地考虑其中一种:以arr[i]结尾的子序列。使用maxendinghere表示这种特殊子序列的最大和。我们考虑最大和子序列的组成特点,有且仅有两种:
- 与arr[0,i-1]相同。
- 以arr[i]结尾。
maxsofar记录的是arr[0,i]的最大和子序列。显然,每遍历一个元素,就得更新maxsofar。
时间复杂度O(n)。
深入思考:如何确定最大和子序列的构成呢?也就是确定arr[i,j]中的i,j。
阅读全文
0 0
- 连续子序列最大和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 最大连续子序列和
- 使用node搭建一个简单服务
- [vue.js音乐App开发记录]Vuex的应用及应用时的项目文件结构设计以完整demo实例解释
- JavaScript<四>
- linux ssh无密钥登陆
- TabLayout +ViewPager+Fragment + RecycleView + webView加载本地html
- 最大连续子序列和
- CXF简介
- hrbust I Want Candy 2353
- 对话框
- 111
- 梦想还是要有的——2018
- OMP学习笔记
- 已发货未发货
- 解决ubuntu下定时任务不执行问题