Ss1Two-最大子列和的四种算法及其时间复杂度分析

最大子列和的四种算法及其时间复杂度分析

题目描述:

给定 n n n个整数序列,{ A 1 , A 2 , ⋯   , A n A_1,A_2,\cdots,A_n A1,A2,,An},求函数 f ( i , j ) = m a x { 0 , ∑ k = i j A k } f(i,j)=max\left\{ 0,\sum_{k=i}^{j}A_k \right\} f(i,j)=max{ 0,k=ijAk} 的最大值。

算法一:暴力破解法

​ 算出所有的子列和,找出最大的,即为所求。

​ 代码如下:

int maxSubseqSum1(int a[]) {
   
    int preSum = -1, maxSum = -1;                    //presentSum记录当前Sum,MaxSum记录最大子列和。
    int left = -1, right = -1;                       //left、right记录最大子列的左右端点值。
    for (int i = 0; i < n; i++) {
                       //i记录左端点
        for (int j = i; j < n; j++) {
                   //j记录右端点
            preSum = 0;
            for (int k = i; k <= j; k++) {
   
                preSum += a[k];                     //累加计算a[i]->a[j]的子列和
            }
            if (preSum > maxSum) {
   
                maxSum = preSum;                    //更新最大值及其对应的左右边界
                left = i;
                right = j;
            }
        }
    }
    printf("in maxSubseqSum1() left=%d,right=%d,maxSum=%d\t暴力破解法\n", left, right, maxSum);
    return maxSum;
}

​ 时间复杂度较容易由3层嵌套for循环得出为
T ( n ) = ∑ i = 1 n ∑ j = i n ∑ k = i j 1 = O ( n 3 ) T(n)=\sum_{i=1}^n\sum_{j=i}^n\sum_{k=i}^j1=O(n^3) T(n)=i=1nj

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值