求一个向量的任何连续最接近0的子向量的和

//求一个向量的任何连续最接近0的子向量的和
/*
比如向量(31,-41,59,26,-53,58,97,-93,-23,84);
最大和是从97到-93即为4
*/

#include<stdio.h>
#include<math.h>

//返回最接近0的数
int closeZero( int x, int y );
//最原始的算法,复杂度为T(n)=O(n*n)
int oringinal( int v[], int len );

void main()
{
         int i = 0;
         int v[] = {31,-41,59,26,-53,58,97,-93,-23,84};
         int len = 0;
         int result;
         len = sizeof(v) / sizeof(int);
         printf("oringinal datas:\n");
         for( i = 0; i < len; i++ )
        {
            printf("%d\t",v[i]);
        }
        printf("\n");
        //最原始的算法
        result = oringinal(v,len);
        printf("oringinal(v,len):%d\n",result);
 
}


//返回最接近0的数
int closeZero( int x, int y )
{
         if( abs(x) > abs(y) )
         {
             x = y;
         }
         return x;
}

 

//最原始的算法,复杂度为T(n)=O(n*n)
int oringinal( int v[], int len )
{
         int sofar = v[0];
         int i;
         int j;
         int sum = 0;

         for( i = 0; i < len; i++ )
         {
             sum = 0;
             for( j = i; j < len; j++ )
             {
                 sum += v[j];
                 sofar = closeZero( sum, sofar );
             }
         }
         return sofar;
}

 运行结果:

不知道复杂度还可不可以降低,如果有更好的算法,望回复,谢谢!

/*博主寄语:如若发现错误,望指出,谢谢*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值