题目描述:有一个数的序列,其中可能有负数,请编写方法得到该序列的一个子序列,此子序列的和最大。比如序列为-1,1,-1,8,-1,3,-2,最大和子序列为8,-1,3,最大和为10。
解法一:(时间复杂度为O(n2) )
双重循环
int arr[] = { -1, 1, -1, 8, -1, 3, -2 };
int num = sizeof(arr)/sizeof(*arr);
int s1, s2;
s1 = 0;
s2 = 0;
for (int i = 0; i < num; ++i)
{
s1 = 0;
for (int j = i; j < num; ++j)
{
s1 += arr[j];
if (s1 > s2)
{
s2 = s1;
}
}
}
cout << s2 << endl;
解法二:(时间复杂度为O(n) )
int arr[] = { -1, 1, -1, 8,-1, 3, -2 };
int num = sizeof(arr)/sizeof(*arr);
int cur_sum; // 当前序列和
int max_sum; // 最大序列和
cur_sum = 0;
max_sum = arr[1];
for (int i = 0; i < num; ++i)
{
cur_sum += arr[i];
if (cur_sum> max_sum)
{
max_sum = cur_sum;
}
else
{
if (cur_sum< 0)
{
cur_sum = 0;
}
}
}
cout << max_sum <<endl;