连续子数组的最大和
2016-05-16 22:49
246 查看
题目:输入一个整型数组,数组里有整数也有负数。数组中一个或连续的多个整数组组成一个整数组。求所有字数组的和的最大值。要求时间复杂度为O(n)。
例如数组:{1, -2, 3,,10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2},因此输出为该字数组的和为18.
首先,想枚举出数组的所有子数组并求出它们的和是行不通的,因为要求了时间复杂度为O(n)。
不过我们可以举例子来分析以下数组的规律。比如从头到尾累加这个数组中的数字,先是1,然后加了-2,sum变成了-1.现在想想,从第一个数字开始的字数组的和回小于从第三个数字开始的字数组的和。因为前边的和为负数了。所以sum应该从3开始加,sum现在等于3了,再加10,变为13,再加-4,sum变为9,那么刚刚的13可能是最大值,可以现将13保存下来。sum继续加7,sum=16,更新sum可能的最大值,再加2,sum=18,再加-5,又要减小了,比较一下sum和保存的sum可能的最大值,然后保存。sum=13.数组现在结束了,我们保存的那个可能的最大值就是连续子数组的最大和了。
如此分析之后,我们就可以写出如下代码了:
写完记得测试呦!
例如数组:{1, -2, 3,,10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2},因此输出为该字数组的和为18.
首先,想枚举出数组的所有子数组并求出它们的和是行不通的,因为要求了时间复杂度为O(n)。
不过我们可以举例子来分析以下数组的规律。比如从头到尾累加这个数组中的数字,先是1,然后加了-2,sum变成了-1.现在想想,从第一个数字开始的字数组的和回小于从第三个数字开始的字数组的和。因为前边的和为负数了。所以sum应该从3开始加,sum现在等于3了,再加10,变为13,再加-4,sum变为9,那么刚刚的13可能是最大值,可以现将13保存下来。sum继续加7,sum=16,更新sum可能的最大值,再加2,sum=18,再加-5,又要减小了,比较一下sum和保存的sum可能的最大值,然后保存。sum=13.数组现在结束了,我们保存的那个可能的最大值就是连续子数组的最大和了。
如此分析之后,我们就可以写出如下代码了:
enum { VALID, INVALID }state; int FindGreatestSumOfSubArray(int arr[], int n) { int sum = 0; int old_sum = 0x80000000; int i = 0; state = INVALID; if (NULL == arr || n <= 0) return 0; for (i = 0; i < n; i++) { if (sum < 0) { sum = arr[i]; } else { sum += arr[i]; } if (sum > old_sum ) { old_sum = sum; } } state = VALID; return old_sum; }
写完记得测试呦!
相关文章推荐
- C++ STL--stack/queue 的使用方法
- [Swift自学之旅一]Swift的一些基本知识
- OSPF协议
- 月经贴 】 Csharp in depth
- Ubuntu14.04重置密码的方法
- win7用zip安装mysql
- SQL Server 2008 R2 Express 无法从远端服务器连接
- Java MVC三层架构在各框架中的特征
- MyBatis学习--延迟加载
- SQL Server 存储过程
- 学生信息管理系统
- 【树链剖分】树链剖分讲解
- Spark中组件Mllib的学习5之ALS测试(apache spark)
- 第9章 数据结构
- Java并发编程:volatile关键字解析
- UVA 10002 Center of Masses(凸包)
- 给set集合中的元素根据字符串长度进行排序
- 小白学习java到底需不需要不求甚解?
- 第9章 数据结构
- 第9章 数据结构