您的位置:首页 > 其它

返回一个整数数组中最大子数组的和

2015-03-26 19:50 183 查看
要求:
输入一个整型数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

第一次读题目时,将重点放到了输入一个既有正数也有负数的整型数组上,想着如何随机输入,从而使整个题目难以入手。
再读题目后,将整型数组直接定义完成。题目的重点在于如何去求子数组和的最大值,并且时间复杂度为O(n)。
刚开始思路采用最直接的办法,将所有的数组之和一个一个求出并比较,但这样做,时间复杂度不可能为O(n)。

for (int i = 0; i < n; i++)
{
for (int j = i; j < n; j++)
{
for (int k = i; k < j; k++)
{
b += arr[k];
}
if (b > MaxSum)
MaxSum = b;
b = 0;
}
}
return MaxSum;


随后通过网上查找资料,发现这是一道著名的面试题目,通过看大神的代码,得出最简洁的过程:

因为整个数组中有正有负,因此子数组的和也有这两种可能,通过分析,当某一段子数组的和为负数时,就没有继续加下去的必要,将出现负数和之前的那个最大和用b表示出来,而新的子数组从出现负数和最后一位的下一位开始加,因此可以节约不少时间。

#include<iostream>
using namespace std;

int MaxSum(int *arr, int size)
{
int MaxSum = 0;
int b = 0;//b是子数组的和

for (int i = 0; i < size; i++)
{
if (b < 0)
b = arr[i];//当子数组和小于0时,与无论与后面数组如何相加,和肯定小于后一段数组之和,此时,将b重新赋值,置为下一个元素
else
b += arr[i];
if (MaxSum < b)
MaxSum = b;
}
return MaxSum;
}

int main()
{
int arr[10] = { 2, -3, 4, 1, -6, 2, 10, -1, 9, 5 };
cout <<"最大子数组的和为:"<< MaxSum(arr, 10) << endl;
return 0;
}



通过这次练习,发现自己编程能力仍然很欠缺,缺少编程实践,只能通过去查阅资料来获得思路,这次练习自己的完成度也不是很高,有待加强。

时间记录表

日期开始时间结束时间中断时间净时间活动备注
15.3.2519:0021:0010110编程基础教学楼602
22:0022:24看书
15.3.2616:3717:30查阅资料
18:4919:45根据查阅的资料修改程序
19:51程序完成自己的完成度不高
缺陷日志没有及时记录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: