返回一个整数数组中最大子数组的和
2015-03-26 19:50
183 查看
要求:
输入一个整型数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
第一次读题目时,将重点放到了输入一个既有正数也有负数的整型数组上,想着如何随机输入,从而使整个题目难以入手。
再读题目后,将整型数组直接定义完成。题目的重点在于如何去求子数组和的最大值,并且时间复杂度为O(n)。
刚开始思路采用最直接的办法,将所有的数组之和一个一个求出并比较,但这样做,时间复杂度不可能为O(n)。
随后通过网上查找资料,发现这是一道著名的面试题目,通过看大神的代码,得出最简洁的过程:
因为整个数组中有正有负,因此子数组的和也有这两种可能,通过分析,当某一段子数组的和为负数时,就没有继续加下去的必要,将出现负数和之前的那个最大和用b表示出来,而新的子数组从出现负数和最后一位的下一位开始加,因此可以节约不少时间。
![](http://images.cnitblog.com/blog2015/718033/201503/261938507559076.png)
通过这次练习,发现自己编程能力仍然很欠缺,缺少编程实践,只能通过去查阅资料来获得思路,这次练习自己的完成度也不是很高,有待加强。
时间记录表
缺陷日志没有及时记录。
输入一个整型数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为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; }
![](http://images.cnitblog.com/blog2015/718033/201503/261938507559076.png)
通过这次练习,发现自己编程能力仍然很欠缺,缺少编程实践,只能通过去查阅资料来获得思路,这次练习自己的完成度也不是很高,有待加强。
时间记录表
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
15.3.25 | 19:00 | 21:00 | 10 | 110 | 编程 | 基础教学楼602 |
22:00 | 22:24 | 看书 | ||||
15.3.26 | 16:37 | 17:30 | 查阅资料 | |||
18:49 | 19:45 | 根据查阅的资料修改程序 | ||||
19:51 | 程序完成 | 自己的完成度不高 | ||||
相关文章推荐
- 3月17号周二课堂练习:结对开发----返回一个整数数组中最大子数组的和一
- 返回一个整数数组中最大子数组的和
- 返回一个整数数组中最大子数组的和(升级版)
- 返回一个整数数组中最大子数组的和-课堂训练(子数组为连续)
- 返回一个整数数组中最大子数组的和之测试
- 结对开发之《返回一个整数数组中最大子数组的和》
- 3月24号周二课堂练习:结对开发----返回一个整数数组中最大子数组的和二
- 返回一个整数数组最大子数组的和
- 返回一个整数数组中最大子数组的和(数组头尾连接)
- 返回一个整数数组中最大子数组的和2
- 结对开发之返回一个整数数组中最大子数组的和
- 课堂练习之结对开发项目思想总结:返回一个整数数组中最大子数组的和
- 返回一个整数数组中最大子数组的和
- 题目:返回一个整数数组中最大子数组的和。
- 返回一个二维整数数组中最大子数组的和1
- 题目:给一个排序好的整数数组A,请写一个函数,输入是数组A和一个整数x,返回数组A中值小于x的最大元素的索引值
- 软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)
- 返回一个整数数组中最大子数组的和
- 返回一个整数数组中最大子数组的和
- 返回一个整数数组中最大子数组的和