最大子列和问题
来源:互联网 发布:person php 编辑:程序博客网 时间:2024/06/15 00:16
题目
给定N个整数的序列{
解法
算法1: 该算法时间复杂度T(N) = O(N3)
int MaxSubseqSum1(int A[], int N){ int ThisSum, MaxSum = 0; int i, j, k; for( i = 0; i < N; i++){ /*i是子列左端位置*/ for(j = i; j < N; j++){ /*j是子列右端位置*/ ThisSum = 0;/*ThisSum是从A[i]到A[j]的子列和*/ for(k = i; k <= j; k++) ThisSum += A[K]; if(ThisSum > MaxSum) /*如果刚得到的这个子列和更大*/ MaxSum = ThisSum; /*则更新结果*/ } /*j循环结束*/ } /*i循环结束*/ return MaxSum;}
算法2:T(N) = O(N2)
int MaxSubseqSum2(int A[], int N){int ThisSum, MaxSum = 0; int i ,j; for(i = 0; i < N; i++){ /*i是子列左端位置*/ ThisSum = 0; /*ThisSum是从A[i]到A[j]的子列和*/ for(j = i; j < N; j++){ /*j是子列右端位置*/ ThisSum += A[j]; /*对于相同的i,不同的j只要在j-1次循环的基础上累加1项即可*/ if(ThisSum > MaxSum) /*如果刚得到的这个子列和更大*/ MaxSum = ThisSum; /*则更新结果*/ } /*j循环结束*/ } /*i循环结束*/ return MaxSum;}
算法3:分而治之 T(N)=O(N*log N)
具体原理这位大神讲得非常明白,很佩服
int Max3( int A, int B, int C ){ /* 返回3个整数中的最大值 */ return A > B ? A > C ? A : C : B > C ? B : C;}int DivideAndConquer( int List[], int left, int right ){ /* 分治法求List[left]到List[right]的最大子列和 */ int MaxLeftSum, MaxRightSum; /* 存放左右子问题的解 */ int MaxLeftBorderSum, MaxRightBorderSum; /*存放跨分界线的结果*/ int LeftBorderSum, RightBorderSum; int center, i; if( left == right ) { /* 递归的终止条件,子列只有1个数字 */ if( List[left] > 0 ) return List[left]; else return 0; } /* 下面是"分"的过程 */ center = ( left + right ) / 2; /* 找到中分点 */ /* 递归求得两边子列的最大和 */ MaxLeftSum = DivideAndConquer( List, left, center ); MaxRightSum = DivideAndConquer( List, center+1, right ); /* 下面求跨分界线的最大子列和 */ MaxLeftBorderSum = 0; LeftBorderSum = 0; for( i=center; i>=left; i-- ) { /* 从中线向左扫描 */ LeftBorderSum += List[i]; if( LeftBorderSum > MaxLeftBorderSum ) MaxLeftBorderSum = LeftBorderSum; } /* 左边扫描结束 */ MaxRightBorderSum = 0; RightBorderSum = 0; for( i=center+1; i<=right; i++ ) { /* 从中线向右扫描 */ RightBorderSum += List[i]; if( RightBorderSum > MaxRightBorderSum ) MaxRightBorderSum = RightBorderSum; } /* 右边扫描结束 */ /* 下面返回"治"的结果 */ return Max3( MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum );}int MaxSubseqSum3( int List[], int N ){ /* 保持与前2种算法相同的函数接口 */ return DivideAndConquer( List, 0, N-1 );}
算法4:在线处理 T(N) = N
//”在线”的意思是指每输入一个数据就进行即时处理,在任一个地方终止输入,算法都能给出当前的解
int MaxSubseqSum4(int A[], int N){int ThisSum, MaxSum; int i; ThisSum = MaxSum = 0; for(i = 0; i < N; i++){ ThisSum += A[i]; /*向右累加*/ if(ThisSum > MaxSum) MaxSum = ThisSum; /*发现更大的和则更新当前结果*/ else if(ThisSum < 0) /*如果当前子列和为负*/ ThisSum = 0; /*则不可能使后面的部分和增大,抛弃之*/ } return MaxSum;}
阅读全文
0 0
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- 最大子列和问题
- Leetcode个人题解455
- 打包工具nw-builder的使用
- BZOJ 4198 [Noi 2015] Huffman树 解题报告
- dubbo发布与引用
- Binary Search:153. Find Minimum in Rotated Sorted Array
- 最大子列和问题
- 关于全局变量、局部变量、静态变量的思考
- shell条件嵌套(if条件语句)
- Mybatis阿里云分页插件-PageHelper使用
- mybatis框架开发环境搭建
- CentOS7设置ssh服务以及端口修改
- c语言基础
- OpenGL_12:上下键调整图片可见度
- 反射获取静态属性