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

来源:互联网 发布:突然蹦出鬼吓人软件 编辑:程序博客网 时间:2024/05/09 04:41

//求一个向量的任何连续最接近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;
}

 运行结果:

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

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