求最大子数组02

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

要求:

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

这次任务多了一个要求就是这个数组是环形的,

也就是可以从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 XX X O O O O X XX 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  

我的小组成员:刘伟
时间: 2024-10-10 17:26:36

求最大子数组02的相关文章

一维数组头尾相连求最大子数组

题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1. 设计思想: 因为已经写过了一维数组的求最大子数组程序.所以只是在原程序上进行修改.首先产生随机数数组,然后进行计算,因为要求时间复杂度

二维数组求最大子数组

设计思路: 首先定义产生二维数组,定义可输入二维数组行和列,各位数随机产生: 然后进行最大子数组的求和比较,从每行的第一个数为子数组的起点开始进行不同的子数组遍历比较,只存放最大的子数组,以及记录最大子数组的位置,从第一个数开始每行每列进行求和比较,以求得最大子数组的值,以及最大子数组所包含的数: 最后进行结果的输出与验证. 代码: 法一: package zishuzu; import java.util.*; public class zuixiaozishuzu { public stat

一维数组求最大子数组(解决溢出问题)

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 程序在宏里面定义出了数组长度的大小,在长度超过100万的时候程序直接崩溃,其实这并不是因为结果太大导致的数值溢出,而是因为内存溢出,我们的数组是定义在程序内部的,属于局部变量,存放位置在栈上

结对开发--四实现循环二维数组求最大子数组的和

一.实现思路 再上一个实验基础上加上环,我们实现环的思想是每一列依次向此替换,直至替换出能出现的所有的二维数组,再用上一个求最大子数组的方法全部实现 二.实验代码 package com.minirisoft; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Scanner; public class HuanTwoArray { public stat

课堂作业:首尾相连求最大子数组

1.设计思想 先将数组环拆解补在原来数组后面,再依次找子数组并相加,更新最大值,并需要将开始的负数舍去从正数开始算起,单独讨论全负情况. 2.源程序 package zishuzu; import java.util.Scanner; public class zsz { public static void main(String[] args) { System.out.println("请输入数字个数:"); Scanner in=new Scanner(System.in);

数组问题之求最大子数组问题(一)

结束了 四则运算的所有内容 这次老师布置了 数组问题 求最大子数组的问题 课堂上 老师就已经提供了数种方案 并提出了时间复杂度的要求 于是和我的搭档找到了认为最为简便的算法 过程中和小于0,那么和最大的子数组不会包含前面子数组,之后将和归0,从下个元素重新开始计算 于之前的实验 理清思路 代码实现不算太难 代码如下 1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int i,num; 7 cout <<

结对——二维数组首尾相连求最大子数组和

一.题目与要求 题目.返回一个二维整数数组中最大子数组的和 要求.1.输入一个二维整形数组,数组里有正数也有负数. 2.二维数组首尾相接,象个一条首尾相接带子一样. 3.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和 二.设计思路 在上一次的以为循环数组的基础上,和二维数组求最大子数组相结合,将功能合并,完成题目要求. 第一步.将每一行的数组作为循环数组求最大子数组 第二步.通过枚举的方式,将每一种情况的和存入到新建二维数组中 第三部.通过逐列计算最大子数组的方法求所有子矩阵的最

循环一维数组求最大子数组

题目: 随机出一个一维数组,设该数组为循环数组,求其最大小子数组. 一.设计思路 求最大子数组,就求出最大的连续正子数组. 将数组分为全负和有非负值两种情况.全负求出最大值即可. 在有非负值的情况下,先判断该随机数组的首尾是否相连,即首尾是否都大于等于零.如果首尾相连,则将该一维数组分为首.中.尾三部分,先求出首尾和S1,再求中间最大连续正子数组和S,令S1和S与maxS相比较,求出最大子数组:如果首尾不相连,则直接借鉴前一种情况中部的算法,求最大正子数组S. 二.源代码 1 //刘双渤,刘洪阳

环形数组求最大子数组之和

环形数组求最大子数组之和: 实验要求: 随机产生一个整形数组,假设首尾相连为环形,求其相连的字数组的和,并输出子数组的元素. 设计思路: 因为是环形,所以要考虑自设的头尾的情况,在此分为两大类考虑,一种为数组中存在正数情况,一种为全部为负数的情况: 在存在正数的情况中又可分为三种情况,一种为全部为正数的情况,一种为自设的头元素为正数,最后一种为自设的头元素为负数.根据这几种情况分类进行实现. 在实现过程中,对数组元素从头到尾进行遍历,如果遇到正数即用和相加,直到相邻的下一个为负数,即存放目前该最