算法习题4:求子数组的最大和
2013-10-10 21:20
239 查看
求数组或者子数组和最大的序列
求子数组的最大和
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
记得这个问题最先看见是在一次笔试中看见的,第一感觉就是,这个画图,求导,现在想想,可笑了,真是把问题复杂化了。。。
就是把阴影面积求出正的呗,结果。。。似乎没啥用处 对于解题。。
其实很简单,你用一个变量专门记录临时累加和,如果累加是正的救继续,如果出现负的,那说明最后加入的这个肯定是负的,而且这
之前的所有序列可以放弃了,可能会有人有点想不明白,这里给出证明把
假设a[0]+a[1]+....+a[i]+.......+a[j]<0 式1
那么我们的结论是这里前j个元素都可以放弃,有的人会想,是否有可能 a[i]+....a[j]>0 呢?
我们知道a[0] + a[1]+.....+a[i-]>0(否则就被我们丢弃了)
那式1看成两部分,前i-1个元素之和大于0,后半部分必须小于0 才能使得整体小于0,所以。。。
/---
补充下:这题还考察大家是否注意了:如果输入的数字全为负数的情况?我这里就默认输出0
当时就被面试官问道这个点上了,当时考虑了觉得只是一种特例,对解题没什么影响所以忽略了。。大家注意下这个特例吧
/---
求子数组的最大和
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
记得这个问题最先看见是在一次笔试中看见的,第一感觉就是,这个画图,求导,现在想想,可笑了,真是把问题复杂化了。。。
就是把阴影面积求出正的呗,结果。。。似乎没啥用处 对于解题。。
其实很简单,你用一个变量专门记录临时累加和,如果累加是正的救继续,如果出现负的,那说明最后加入的这个肯定是负的,而且这
之前的所有序列可以放弃了,可能会有人有点想不明白,这里给出证明把
假设a[0]+a[1]+....+a[i]+.......+a[j]<0 式1
那么我们的结论是这里前j个元素都可以放弃,有的人会想,是否有可能 a[i]+....a[j]>0 呢?
我们知道a[0] + a[1]+.....+a[i-]>0(否则就被我们丢弃了)
那式1看成两部分,前i-1个元素之和大于0,后半部分必须小于0 才能使得整体小于0,所以。。。
/---
补充下:这题还考察大家是否注意了:如果输入的数字全为负数的情况?我这里就默认输出0
当时就被面试官问道这个点上了,当时考虑了觉得只是一种特例,对解题没什么影响所以忽略了。。大家注意下这个特例吧
/---
//============================================================================ // Name : SubSequenceMaxSum.cpp // Author : YLF // Version : // Copyright : Your copyright notice // Description : solve the max sum of subsequence, Ansi-style //============================================================================ #include <iostream> using namespace std; #define MAX 50 void subSum(int*, int); int main() { int arr[MAX]; int num = 0; cin>>num; int i=0; for(i=0;i<num;i++) cin>>arr[i]; subSum(arr, num); return 0; } void subSum(int *arr, int n){ int i=0; int sum = 0;//记录最大值 int tempSum = 0;//临时记录 int start=-1,end=-1; for(i=0;i<n;i++){ if(tempSum < 0){ tempSum = arr[i];//重新开始记录 start = i; end = i; }else{ tempSum += arr[i]; } if(tempSum > sum){ sum = tempSum; end = i; } } cout<<"the max subsequence:"<<endl; for(i=start;i<=end;i++) cout<<arr[i]<<","; cout<<endl<<"the sum:"<<sum<<endl; }
相关文章推荐
- 数据结构与算法-求子数组的最大和
- 微软算法100题03 求子数组的最大和
- 算法学习二----求子数组的最大和
- Java实现算法之--求子数组和的最大值
- 求子数组和的最大值算法
- 算法--将数组分成和相等的多个子数组,求子数组的最大个数
- 【算法总结-DP】求子数组的最大和
- 算法--将数组分成和相等的多个子数组,求子数组的最大个数
- 算法习题45:对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一;;;一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 算法 - 求子数组的最大和(C++)
- 人人都来写算法 之 求子数组的最大和
- Java实现求子数组和的最大值算法示例
- 算法题13 求子数组的最大和
- 数据结构——算法之(006)(求子数组的最大和)
- 【算法Everyday】第二日 求子数组的最大和
- 每天一道算法题3 求子数组的最大和
- 【算法之数组(一)】求子数组最大和的解决方法详解
- 【算法总结-DP】求子数组的最大和
- 求子数组的最大和【算法】
- 微软等数据结构+算法面试100题(44)-- 求子数组的最大和