1 对于O(N*N)的解法就不必说了,简单粗暴
2 对于ON(logN)的解法
例如 { -1 2 3 -3 -4 5 -4 6 8 3 -5}这个序列,求他的最小子序列
1 设S[0] = 0; 这个是为了更好的区分下表
则有 S[1] = A[1]+S[0]
S[2] =A[2]+S[1]
可以推出任意子序列都可以表示两个序列之差
S[j]-S[i]=A[j]+A[j-1]+A[j-2]+....+A[i+1]+S[i]-S[i]
=A[j]+...A[i+1]
所以这个算法分3部
1 算出S[i]
2 对S[i]排序(是为了相邻的两个子序列更小
3 求差(下标要符合序列不能S[i]-S[j]
/*求最小正子序列和*/
#include <stdio.h>
//定义结构体
struct An{
int S;
int num;
};
//O(N*N*N)
int funca(int *arry, int num)
{
int i,j,k;
int sum,thissum;
sum = 0;
for(i = 0; i< num; i++)
{
if(arry[i] > 0)
{
sum = arry[i];
break;
}
}
if(sum == 0)
{
printf("没有正子项!\n");
return 0;
}
for(i = 0; i<num; i++)
{
for(j = i; j<num;j++)
{
thissum = 0;
for(k = j; k <num; k++)
{
thissum+=arry[k];
if(thissum<sum && thissum > 0)
{
sum = thissum;
}
}
}
}
return sum;
}
//O(N*N)
int funcb(int *arry, int num)
{
int i,j;
int sum,thissum;
sum = 0;
for(i = 0; i< num; i++)
{
if(arry[i] > 0)
{
sum = arry[i];
break;
}
}
if(sum == 0)
{
printf("没有正子项!\n");
return 0;
}
for(i = 0; i<num; i++)
{
thissum = 0;
for(j = i; j<num; j++)
{
thissum+=arry[j];
if(thissum < sum && thissum > 0)
{
sum = thissum;
}
}
}
return sum;
}
int minthree(int num1, int num2, int num3)
{
return ((num1>num2) ? num2:num1) > num3 ? num3:((num1>num2)?num2:num1);
}
//排序 随便写了一个冒泡排序,相同元素的下标要合并为其中最小的一个
void sort(struct An* A, int num)
{
int i,j;
struct An Atemp;
for(i = 0; i<num; i++)
{
for(j = 0; j<num-i-1; j++)
{
if(A[j].S > A[j+1].S)
{
Atemp.S = A[j].S;
Atemp.num = A[j].num;
A[j].S = A[j+1].S;
A[j].num = A[j+1].num;
A[j+1].S = Atemp.S;
A[j+1].num = Atemp.num;
}
}
}
for(i = 0; i< num-1;i++)
{
if(A[i].S == A[i+1].S)
{
j = (A[i].num > A[i+1].num ? A[i+1].num:A[i].num);
A[i].num = j;
A[i+1].num = j;
}
}
}
//O(NlogN)
int funcc(int *arry, int num)
{
struct An A[num+1];
int i = 0;
int thissum = 0;
int sum = 100;
//填0占位
A[0].S = 0;
A[0].num = 0;
//求出序列S和
for(i = 1; i<num+1; i++)
{
A[i].S = arry[i-1] + A[i-1].S;
A[i].num = i;
}
//排序
sort(A, num+1);
//计算相邻两个之间的最小值(必须保证num也是符合序列的)
for(i = 0; i<num; i++)
{
thissum = A[i+1].S-A[i].S;
if(thissum < sum && (A[i+1].num > A[i].num))
{
sum = thissum;
}
}
return sum;
}
int main()
{
// int arry[10] = { 4, 3, 5, -2, -1, 2, 6, -2, -10, 9};
// int a = funca(arry, 10);
// int b = funcb(arry, 10);
// int c = funcc(arry, 10);
int arry[5] = {4, 0, 4, 1, -1};
int c = funcc(arry, 5);
// printf("a = %d\n", a);
// printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}