求最大子数组02
题目:整数数组中最大子数组的和
要求:
- 输入一个整形数组,数组里有正数也有负数。
- 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
- 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
- 同时返回最大子数组的位置。 求所有子数组的和的最大值。
这次要求数组是环形的 高逸凡同学上课的思路很清晰,在此基础上我也没有什莫更好的思路了,就是锁定节点确定子数组就好。子数组的长度一定小于等于原数组,那么两个数组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) 。
缺陷记录日志
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3/27 | 1 | stack overflow | 编码 | 调试 | 20min |