在做这个题的时候,首先想到的是循环嵌套,以数组的每个元素为首元素,并依次计算和,并将和储存,最后求最大值。
int main()
{
int arr[8] = { 1,-2,3,10,-4,7,2,-5 };
int arr1[100] = { 0 };
int count = 0;
int i = 0, j = 0;
for (i = 0; i < 8; i++)
{
arr1[count] = 0;
count++;
for (j = 0; j < 8 - i; j++)
{
arr1[count] = arr1[count-1] + arr[i + j];
count++;
}
}
for (i = 0; i < count-1; i++)
{
for (j = 0; j < count - i - 1; j++)
{
if (arr1[j] < arr1[j + 1])
{
int q = arr1[j + 1];
arr1[j + 1] = arr1[j];
arr1[j] = q;
}
}
}
printf("%d", arr1[0]);
return 0;
}
这样遍历,虽然做对了,可是却不满足题目给出的时间复杂度要求。因此,只允许我们进行一次遍历,那该怎么做呢?
int main()
{
int arr[8] = { 1,-2,3,10,-4,7,2,-5 };
int i = 0;
int sum = 0;//定义当前坐标下元素累加的和
int max = 0;//定义当前子数列累加最大值
for (i = 0; i < 8; i++)
{
if (sum + arr[i] < 0)
sum = 0;/*如果上一次累加和加上当前元素结果为负值,那么它即使
加上别的数也只会使其缩小,所以sum=0干脆扔掉这个拖油瓶,
并且使累加从下一个元素重新开始*/
else
sum += arr[i];/*如果不为0,那么sum存储当前和并且累加,如果
if语句执行,这条代码会跳过当前这个使sum变为负数的元素*/
if (sum > max)
max = sum;//判断sum与max的大小
}
printf("%d", max);
return 0;
}
这样一来问题便迎刃而解。