求最大子数组02

Posted 伟哥8882

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求最大子数组02相关的知识,希望对你有一定的参考价值。

题目:整数数组中最大子数组的和

要求:

  1. 输入一个整形数组,数组里有正数也有负数。
  2. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
  3. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
  4. 同时返回最大子数组的位置。 求所有子数组的和的最大值。  

这次要求数组是环形的 高逸凡同学上课的思路很清晰,在此基础上我也没有什莫更好的思路了,就是锁定节点确定子数组就好。子数组的长度一定小于等于原数组,那么两个数组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  




以上是关于求最大子数组02的主要内容,如果未能解决你的问题,请参考以下文章

求最大子数组的思想和代码

求二维数组最大子数组

环状数组求最大子数组

求一维数组最大最大子数组和

求一个二维整数数组中最大子数组的和

数组问题求二维整型数组最大联通子数组的和