《数据结构与算法》Day.1 最大子列和
- 2019 年 12 月 19 日
- 筆記
算法1:暴力法
int MaxSubseqSum1(int A[], int N) { int ThisSum, MaxSum = 0; int i, j, k; for( i = 0; i < N; i++) { for( j = i; j < N; j++) { ThisSum = 0; for( k = i; k <= j; k++) { ThisSum += A[k]; if( ThisSum > MaxSum) MaxSum = ThisSum; } } } return MaxSum; } // T(N) = O(N^3)
算法2:还是暴力法
int MaxSubseqSum2(int A[], int N) { int ThisSum, MaxSum = 0; int i, j, k; for( i = 0; i < N; i++) { ThisSum = 0; for( j = i; j < N; j++) { ThisSum += A[j]; if( ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; } // T(N) = O(N^2)
算法3:二分法
//返回3个整数中的最大的一个 int getmaxint3(int a,int b,int c) { return a>b?(a>c?a:c):(b>c?b:c); } //递归调用分治思想的核心代码 int MaxSubseqSum3(int nums[],int left,int right) { //左右最大子列和 int MaxLeftSum, MaxRightSum; //跨边界左右最大子列和 int MaxLeftBorderSum, MaxRightBorderSum; //当前计算的左右边界子列和 int LeftBorderSum, RightBorderSum; int center, i; //递归调用终止条件,子列只有一个元素 if( left == right ) { if( nums[left] > 0 ) return nums[left]; else return 0; } //先分 center = ( left + right ) / 2; //递归调用获取左边最大子列和 left.....center MaxLeftSum = MaxSubseqSum3( nums, left, center ); //递归调用获取右边最大子列和 center+1.....right MaxRightSum = MaxSubseqSum3( nums, center+1, right ); //跨边界最大子列和 MaxLeftBorderSum = 0; LeftBorderSum = 0; for( i=center; i>=left; i-- ) { /* 从中线向左扫描 */ LeftBorderSum += nums[i]; if( LeftBorderSum > MaxLeftBorderSum ) MaxLeftBorderSum = LeftBorderSum; } /* 左边扫描结束 */ MaxRightBorderSum = 0; RightBorderSum = 0; for( i=center+1; i<=right; i++ ) { /* 从中线向右扫描 */ RightBorderSum += nums[i]; if( RightBorderSum > MaxRightBorderSum ) MaxRightBorderSum = RightBorderSum; } /* 右边扫描结束 */ /* 下面返回"治"的结果 */ return getmaxint3( MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum ); }
算法4:在线处理法
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; } //T(N) = O(N);
———————————————— 版权声明:本文为博主「Sofar」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://sofar1994.github.io/post/19111/