循环一维数组最大子数组

结对人员:张世通  梁世豪

一、题目

  •   返回一维数组中最大子数组的和
  •   输入一个整形数组,数组里有正数也有负数。
  •   数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
  •   如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
  •   同时返回最大子数组的位置。
  •   求所有子数组的和的最大值。
  •   要求时间复杂度为O(n)

二、设计思路

  1、在上一次求一维数组最大子数组的问题上,进行拓展,继续使用类似的求和方法

  2、通过定义变量start,finish确定最大子数组的起始位置和终止位置

  3、每次将所有与数组元素A[i]有关的子数组求出后,将A[i]的值付给A[length+i];

  4、循环到最后一个数组元素A[length-1]时终止,即可遍历完所有数组元素

三、代码

 1 // ketang6.cpp : 定义控制台应用程序的入口点。
 2 //
 3 #include"stdafx.h"
 4 #include "iostream"
 5 using namespace std;
 6
 7 /*确定求和存储数组元素*/
 8 void Son(int Arr[],int length,int start,int finish)
 9 {
10     int max=Arr[0];
11     int add=0;//定义求和变量
12      for(int i=0;i<length;i++)
13      {
14         add=0;
15         for(int j=i;j<length+i;j++)
16         {
17             add=add+Arr[j];
18             if(add>max)
19             {
20                 max=add;
21                 start=i;
22                 finish=j;
23             }
24         }
25         Arr[length+i]=Arr[i];                                //每次将已经计算过的数放到最后
26      }
27      if(finish>=length)
28      {
29          cout<<"最大子数组起始位置为:"<<start+1<<endl;
30          cout<<"最大子数组终止位置为:"<<finish-length+1<<endl;
31      }
32      else
33      {
34          cout<<"最大子数组起始位置为:"<<start+1<<endl;
35          cout<<"最大子数组终止位置为:"<<finish+1<<endl;
36      }
37      cout<<"最大子数组为:"<<endl;
38      for(int m=start;m<=finish;m++)
39      {
40          cout<<Arr[m]<<" ";
41      }
42      cout<<endl;
43      cout<<"最大子数组的和为:"<<endl;
44      cout<<max<<endl;
45 }
46
47 /*主函数*/
48 int main()
49 {
50     int num,length,start,finish;//定义原始数组长度length,求和存储数组长度num
51     start=0;
52     finish=0;
53     cout<<"请输入数组元素个数:";
54     cin>>length;
55     num=2*length;
56     int* Arr=new int[num];//定义原始数组
57     cout<<"请输入数组数据"<<endl;
58     for(int i=0;i<length;i++)
59     {
60         cin>>Arr[i];
61     }
62     cout<<endl;
63     Son(Arr,length,start,finish);
64     delete []Arr;
65     return 0;
66 }

四、运行结果截图

五、分析总结

  这次是对上次的一维数组的拓展,代码数量不大,所以在这次的代码实现过程中,主要是一个讨论的过程,我们主要讨论了实现循环数组的方法和返回位置的思路。我觉得在这次结对开发中,发挥出了合作的优势,想法来的特别快,大概是思路碰撞出了火花,很快便解决了这个问题。当然,这不是偶然的

  虽然这次的代码不长,但还是遇到了问题在解决时间复杂度O(n)时,返回位置不正确,所以采取了另一种方法,时间复杂度为O(n2),虽然没有实现时间复杂度,但是解决问题的过程却是很重要的,这是我们两个人能够坚持合作的根本

  结对开发,给两个人提供的一个积极的条件,也可以给予双方一定的压力,能够刺激我们付出很大的热情投入到设计开发之中,在这个过程中,两个人可能会有矛盾,但是可以一起解决矛盾,思路的对碰才会出现新的想法。结队开发,看重的是两个人的合作,在这当中,我负责编写,梁世豪负责复查,这对我们两个人都有帮助,可以是我们的水平得到共同的提升。

六、工作照

时间: 2025-01-05 03:11:23

循环一维数组最大子数组的相关文章

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

设计思路: 一维循环数组:一维整数组头跟尾相连形成一个环. 问题解决方案:将一个一维数组扩大两倍,求新的数组的最大子数组即可. import java.io.IOException; public class xunhuanshuzu { public static void main(String[] args)throws IOException{ int []a= {23,-12,234,-234,123,2,0,1,-1,-34}; int n=a.length; int []b=new

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

结对成员:信1201-1班 于海洋   袁佩佩 一.题目与要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 二.设计思路 利用之前的返回一个整数数组最大子数组的和程序的思路,不过这里将数放到一个链表里,首尾相连,来求最大子数组的和. 三.源

环一维数组最大子数组问题

设计思路: 一个含有n个数值的一维环数组.可以把他分为n个一维数组,分别求出这n个以为数组的最大值.然后他这些值放在另一个一维数组中.再比较,求出最大子数组. 代码: package 整数环数组最大子数组的和; import java.util.Random; import java.util.Scanner; public class one { public static void main(String[] args) { // TODO 自动生成的方法存根 System.out.prin

结对开发——一维数组最大子数组判断溢出

一 题目 求一维数组最大子数组和 要求:1000个数以上,整数 二.设计思路 最大子数组很好找到,但是子数组和的溢出问题很难解决. 经过不断的思考,我得出了结论: 溢出是程程序设计者设计时的不足所带来的错误.所以设计者要在编码时便高度警惕,预防溢出的发生,这才是最本质的解决问题的方法.就本题而言,我们设置了元素最大个数,以及其它输入要求,尽量避免溢出的发生.1000个数相加可以实现,但非要取1000个最大的数相加,那样的计算没有意义,不会在我们的生活学习中出现,这属于科研问题,交给大神们来解决吧

结对开发_求一维数组最大子数组和判断溢出

题目 求一维数组最大子数组和 要求:1000个数以上,整数 二.设计思路 最大子数组很好找到,但是子数组和的溢出问题很难解决. 经过不断的思考,我得出了结论: 溢出是程程序设计者设计时的不足所带来的错误.所以设计者要在编码时便高度警惕,预防溢出的发生,这才是最本质的解决问题的方法.就本题而言,我们设置了元素最大个数,以及其它输入要求,尽量避免溢出的发生.1000个数相加可以实现,但非要取1000个最大的数相加,那样的计算没有意义,不会在我们的生活学习中出现,这属于科研问题,交给大神们来解决吧.

求一维数组最大子数组和判断溢出

一题目 一.实验要求 求一维数组最大子数组和 要求:1000个数以上,32位整数 二.设计思路 因为我们的程序一开始就可以运算1000个以上数的运算,最大个数为364,526,269,原因为找出. 这次实验主要目的是解决最大值溢出的问题,本来想输出这个溢出的数值,但没有实现,于是改为若溢出,则输出提示,并返回溢出的上一个最大值. 三.代码 1 // ketang4.cpp : 定义控制台应用程序的入口点. 2 //张世通 梁世豪 3 4 #include "stdafx.h" 5 #i

求首位相连一维数组最大子数组的和

结对成员: 朱少辉:主要负责代码编写 侯涛亮:主要负责程序测试 题目:一个首尾相接的一维整型数组,其中有正有负,求它的最大子数组并返回它的位置. 思路:在求一维子数组的基础上,先输入一个含有N个数的一维数组,将此数组向后平移N个使数组长度变为2N个,前N个和后N个值相等.再求这长度为2N的数组最大子数组之和,也就是求从第i个(i=0,1,2..n-1)到第i+n(不包含i+n)个中求最大的子数组和.这样会从0-N-1产生产生N个最大子数组的和,把这N个值存到另个数组中,求出最大值即为首位衔接一维

返回一个二维整数数组最大子数组的和

 要求: 1,输入一个二维整形数组,数组里有正数也有负数. 2,二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和, 3,求所有子数组的和的最大值. 设计思路: 参照一维整数数组求解最大子数组的方法,我们想着将二维数组通过行不同,列相加的方法转化为一维整数数组再求解最大子数组之和. 具体实现:先求出每一行的最大子数组之和,之后比较得出最大和MaxSum,然后通过上述方法求二行的最大子数组之和并与MaxSum比较,用MaxSum存放较大值.以此类推,求三行,四行... 最后实现最大子数

环形二维数组最大子数组的和

设计思路: 因为之前做过二维数组的和环形一维数组的,所以第一感觉就是能不能把这两种整改一下结合起来,所以采用的做法就是将二维环形变化为一维环形,在此采用的方法是从第一行开始,第一行计算出最大子数组,然后第一行和第二行相加为一维计算最大子数组,然后第一行.第二行和第三行,以此类推,最后将各子数组的最大值进行比较,得到最大的即为子数组和的最大值. 实验代码: //环形一维数组求最大子数组 package erwei; public class oneArray { private int i; pu