题目描述:
输入一个整型数组,数组里有正数也有负数。数组中一个或者连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5}和最大的子数组为{3, 10, -4, 7, 2},因此输出为该子数组的和18
思路:
- 因为时间复杂度为O(n),则只能遍历一次数组
- 这里同时使用两个变量sum和max,其中sum保存的是当前的和
- 若sum<0,则从下一个位置从新记录,
- max记录的是历史的最大值,只有当sum>max时用sum替换max。
C代码如下:
int MAX_Arry(int* arr, int sz)
{
int MAX = arr[0];
int sum = arr[0];
int i = 1;
//题目描述:数组里有正数也有负数(最少有两个数)
if (arr == NULL || sz <= 1)
return 0;
for (i = 1; i < sz; i++)
{
//若数组前i部分和为负,则重置sum为arr[i]
if (sum < 0)
sum = arr[i];
else
{
sum += arr[i];
}
if (sum > MAX)
MAX = sum;
}
return MAX;
}
int main() {
int arr[] = { 1, -2, 3, 10, -4, 7, 2, -5 };
int len = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", MAX_Arry(arr, len));
return 0;
}
代码生成图: