程序员面试题100题第03题——求子数组的最大和
2012-10-06 15:43
232 查看
题目:输入一个整型数组,数组里有整数也有负数。数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
分析:
方法一:当我们加上一个正数时和会增加,当我们加上一个负数时,和会减少。如果当前和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零。
方法二:
考虑数组的第一个元素A[0],以及最大的一段数组(A[i]...A[j])跟A[0]的关系,有一下三种情况:
1、0=i=j 元素A[0]本身构成和最大一段;
2、0=i<j 和最大一段从A[0]开始
3、0<i 和最大一段和A[0]没有关系
所以假设:
已经知道
(A[1]...An-1])的最大和段之和为all[1];
(A[1]...An-1])的包含A[1]的最大和段之和为start[1];
那么all[0]=max{A[0], A[0]+start[1], all[1]};
而start[0]=max{A[0], A[0]+start[1]};
所以all[0]=max{start[0],all[1]};
进一步分析可得到额外空间只需要O(1)就足够:
要求时间复杂度为O(n)。
分析:
方法一:当我们加上一个正数时和会增加,当我们加上一个负数时,和会减少。如果当前和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零。
int FindMaxsumOfSubarray(const vector<int>& vec) { int sum=0; int MaxSum=0; for(vector<int>::size_type i=0; i<vec.size(); i++) { sum += vec[i]; if(sum < 0) sum=0; if(sum > MaxSum) MaxSum=sum; } if(MaxSum==0)//if all data are negative ,find the max in vec { MaxSum = vec[0]; for(vector<int>::size_type i=1; i<vec.size(); i++) { sum = vec[i]; if(sum > MaxSum) MaxSum=sum; } } return MaxSum; }
方法二:
考虑数组的第一个元素A[0],以及最大的一段数组(A[i]...A[j])跟A[0]的关系,有一下三种情况:
1、0=i=j 元素A[0]本身构成和最大一段;
2、0=i<j 和最大一段从A[0]开始
3、0<i 和最大一段和A[0]没有关系
所以假设:
已经知道
(A[1]...An-1])的最大和段之和为all[1];
(A[1]...An-1])的包含A[1]的最大和段之和为start[1];
那么all[0]=max{A[0], A[0]+start[1], all[1]};
而start[0]=max{A[0], A[0]+start[1]};
所以all[0]=max{start[0],all[1]};
int max_sum(const vector<int>& arr) { int n=arr.size(); vector<int> all(n); vector<int> start(n); all[n-1]=arr[n-1]; start[n-1]=arr[n-1]; for(int i=n-2; i>=0; i--) { start[i]=max_num(arr[i],arr[i]+start[i+1]); all[i]=max_num(start[i],all[i+1]); } return all[0]; }
进一步分析可得到额外空间只需要O(1)就足够:
int max_sum(const vector<int>& arr) { int n=arr.size(); int nAll=arr[n-1]; int nStart=arr[n-1]; for(int i=n-2; i>=0; i--) { nStart=max_num(arr[i],arr[i]+nStart); nAll=max_num(start[i],nAll); } return nAll; }
相关文章推荐
- 程序员面试题精选100题(03)-求子数组的最大和
- 程序员面试题精选100题(03)-求子数组的最大和
- 程序员面试题精选100题(03)-求子数组的最大和
- 程序员面试题精选100题(03)-求子数组的最大和—python实现
- 程序员面试题100题第03题——求子数组的最大和
- 程序员面试题精选(03)-求子数组的最大和
- (34)-[转载] 程序员面试题精选100题 -找出数组中两个只出现一次的数字
- 程序员面试题精选100题(38)-输出1到最大的N位数[算法]
- 程序员面试题精选100题(42)-旋转数组的最小元素
- 算法与数据结构面试题(3)-求子数组的最大和
- 微软面试题系列(三):求子数组的最大和
- 程序员面试题精选100题(61)-数对之差的最大值
- 程序员面试题精选100题(38)-输出1到最大的N位数[算法]
- 程序员面试题精选100题(34)-数组中只出现一次的数字
- 程序员面试题精选100题(61)-数对之差的最大值
- 面试题五:求子数组的最大和
- 面试100题:3.求子数组的最大和
- 程序员面试题精选100题(29)-调整数组顺序使奇数位于偶数前面[算法]
- 【面试题经典重温【原创】】求子数组的最大和
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字