题目:返回一个整数数组中最大子数组的和
要求:
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
在做前面一道题目时,并没有考虑数组个数的上限及随机数位数问题,以为是要程序不出错,就是完美的。而通过课堂上验证上次程序,发现数组的和超过某一值时,将不会显示,但同样,程序不会报错,在小程序中后果并不严重,但是一旦开发大型软件,极有可能造成不可弥补的错误和经济上的损失。
以下为超过上限截图:
题目要求实现代码:
1 #include<iostream> 2 #include<string> 3 #include<ctime> 4 #define N 1000 5 using namespace std; 6 7 int MaxSum(int *arr, int size) 8 { 9 int MaxSum = 0; 10 int b = 0;//b是子数组的和 11 12 for (int i = 0; i < size; i++) 13 { 14 if (b < 0) 15 b = arr[i];//当子数组和小于0时,且无论与后面数组如何相加,和肯定小于后一段数组之和,此时,将b重新赋值,置为下一个元素 16 else 17 b += arr[i]; 18 if (MaxSum < b) 19 MaxSum = b; 20 } 21 return MaxSum; 22 } 23 24 int main() 25 { 26 int arr[N]; 27 srand(time(0)); 28 for (int j = 0; j < N; j++) 29 { 30 arr[j] = rand() % 1000-500; 31 cout << arr[j] << " "; 32 33 } 34 cout <<"最大子数组的和为:"<< MaxSum(arr, N) << endl; 35 return 0; 36 }
感悟:在编程的时候不仅仅是完成任务目标就可以,更应该考虑该程序的应用范围,继而进行优化
时间: 2024-10-26 00:13:40