这里是算法导论里面的一道习题,要求算法的时间复杂度为O(n).
基本上要用到DP的思想。自己没想出来,是按照网上其它人的思路写出来的。
struct max_sub_array
{
int start;
int end;
int value;
};
struct max_sub_array find_max_sub_array(int *data, int size)
{
struct max_sub_array max, current_max;
max.start = -1;
max.end = -1;
max.value = (1 << 31 );
current_max.start = -1;
current_max.end = -1;
current_max.value = 0;
int i;
for(i = 0; i < size; i++)
{
if( current_max.value + data[i] > data[i] )
{
current_max.value += data[i];
current_max.end = i;
}
else
{
current_max.value = data[i];
current_max.start = current_max.end = i;
}
if( max.value < current_max.value)
{
max = current_max;
}
}
return max;
}
int main(void)
{
// int data[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
int data[] = {-2,1,-3,4,-1,2,1,-5,4};
struct max_sub_array msa = find_max_sub_array(data, sizeof(data)/sizeof(data[0]));
return 0;
}