前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《数据结构与算法》Day.1 最大子列和

《数据结构与算法》Day.1 最大子列和

作者头像
风清醉
发布2019-12-19 13:01:34
2910
发布2019-12-19 13:01:34
举报

算法1:暴力法

代码语言:javascript
复制
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:还是暴力法

代码语言:javascript
复制
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:二分法

代码语言:javascript
复制
//返回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:在线处理法

代码语言:javascript
复制
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/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 算法1:暴力法
  • 算法2:还是暴力法
  • 算法3:二分法
  • 算法4:在线处理法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档