题目:整数数组中最大子数组的和
要求:
- 输入一个整形数组,数组里有正数也有负数。
- 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
- 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
- 同时返回最大子数组的位置。 求所有子数组的和的最大值。
这次任务多了一个要求就是这个数组是环形的,
也就是可以从A[i-1],…… A[n-1],A[0],A[1]这样的数组也阔以,那么首先想到的就是循环链表,然后控制求和的子数组长度即可,但是,链表首元素从哪定呢。。。用DP的话终止条件怎么设置。。。
所以我感觉这个方法可能不太好走,于是,想到了既然是个环形的数组,那子数组也要有要求吧,如果数组元素全部之和为正,
那么一直循环下去求和子数组的和岂不是+∞,这样下去还能了得。。。
,子数组的长度一定小于等于原数组,那么两个数组Arr首尾相接构成的新数组肯定可以包含所有子数组,
然后再打表求所有子数组的和,再求max,这不手到擒来嘛,赶紧的码起
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 #define max_Num 100 5 int main(int argc, char *argv[]) 6 { 7 int a[]={115,15,-565,9465,-66,11,15,9400}; 8 vector<int> arr(a,a+(int)(sizeof(a)/sizeof(int))); 9 arr.insert(arr.end(),arr.begin(),arr.end()); 10 int arrtemp[max_Num][max_Num]={0}; //记录数列之和的表 arrtemp[i][j]表示为子数组arr中[i,j]元素之和 11 for(int i = 0;i <(int)(arr.size()/2); i++) 12 { 13 for(int j = 0;j<(int)(arr.size());j++) 14 { 15 if((i <= j) && (j < i + (int)(arr.size()/2))) //i<=j控制元素顺序,j <i+length控制子数列长度 16 { 17 for(int k = i; k <= j; k++) 18 { 19 arrtemp[i][j] += arr[k]; 20 } 21 } 22 } 23 } 24 25 int maxtemp = arrtemp[0][0]; //临时最大值设为arr[0][0]即 arr[0] 26 int start = 0; 27 int end = 0; 28 for(int i = 0;i < (int)(arr.size()/2); i++) 29 { 30 for(int j = 0;j < (int)(arr.size());j++) 31 { 32 if((i <= j) && (j < (int)(i+arr.size()/2))) //i<=j控制元素顺序,j<i+length控制子数列长度 33 { 34 if( arrtemp[i][j] > maxtemp) 35 { 36 maxtemp = arrtemp[i][j]; 37 start = i; 38 end = j; 39 } 40 } 41 } 42 } 43 44 cout <<"sum:"<< maxtemp <<"start:"<< start <<"end:"<<end % (arr.size() / 2) <<endl; 45 return 0; 46 }
(i <= j) && (j < (int)(i+arr.size()/2))是控制元素求和用的,比如一个数组有4个元素,那么求和打表的内容只能填充到
O O O O X X X X
X O O O O X X X
X X O O O O X X
X X X O O O O X
中 O 的位置,其他位置不可能是子数组之和。
这个程序的复杂度是O(n2) ,
然后注意的是存放临时子数组和的二位数组不能设置太大, 不然会内存溢出。。。。不懂啊 ,我才设1000*1000,就爆了,在QT creator上调试了好久也找不到错,拿到VS上就提示stack overflow
也是醉了。。
日期 | 听课 | 编程 | 读书 | 看代码 | 写博客 | 总结 |
星期一 | 120 | 120 | 150 | 390 | ||
星期二 | 60 | 120 | 180 | |||
星期三 | 90 | 90 | ||||
星期四 | 120 | 120 | 60 | 300 | ||
星期五 | 120 | 120 | ||||
星期六 | 60 | 60 | ||||
星期日 | 240 | 90 | 330 | |||
周总结 | 240 | 600 | 0 | 540 | 90 | 1470 |
缺陷记录日志
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3/27 | 1 | stack overflow | 编码 | 调试 | 20min |
我的小组成员:刘伟