[每日一题]7:求所有子数组的和的最大值

题目描述:

输入一个整型数组,数组里有正数也有负数。数组中一个或者连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5}和最大的子数组为{3, 10, -4, 7, 2},因此输出为该子数组的和18

思路:

  1. 因为时间复杂度为O(n),则只能遍历一次数组
  2. 这里同时使用两个变量sum和max,其中sum保存的是当前的和
  3. 若sum<0,则从下一个位置从新记录,
  4. 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;
}

代码生成图:
在这里插入图片描述

发布了92 篇原创文章 · 获赞 32 · 访问量 4647

猜你喜欢

转载自blog.csdn.net/AngelDg/article/details/104419350