//求一个向量的任何连续最接近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;
}
运行结果:
不知道复杂度还可不可以降低,如果有更好的算法,望回复,谢谢!
/*博主寄语:如若发现错误,望指出,谢谢*/