返回一个整数数组(环形数组)中最大子数组的和

一、实验题目

  题目:返回一个整数数组中最大子数组的和。

  要求:

       输入一个整形数组,数组里有整数也有负数。

       数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

       如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],……A[n-1],A[0]……A[j-1]之和最大。

       同时返回最大子数组的位置。

  求所有子数组的和的最大值。要求时间复杂度为O(n).

二、实验思路

  由于这次所要求的子数组相当于一个环形的数组,所以就想到了类似数字右循环的形式来解决这个题目。(其实主要思想是参考的课堂上一个同学的思想)

  下面我用一个例子来说明一下我们的解题思路:

  例如,我输入的数组是{5,-3,2,-1}第一次循环求得5,和max比较大小,然后把5+(-3)和max比较大小,然后是5+(-3)+2和max比较大小,最后是5+(-3)+2+(-1)和max比较大小,把最大值给max,接下来把5移到-1的后面,再用同样的方法求第二次循环的最大值,只不过这次开始于-3。依次类推,求出最大的子数组。

  由于我和小伙伴编程不是太好,所以返回最大子数组的位置这一个要求没有实现。

三、源代码

 1 // 信1201-2班 司新红 万彤
 2 #include"stdafx.h"
 3 #include "iostream"
 4 using namespace std;
 5
 6 /*主函数*/
 7 int main()
 8 {
 9     int length;//定义数组长度length
10     int n;//定义变化后的数组的长度
11     cout<<"请输入数组元素个数:"<<endl;
12     cin>>length;
13     n=2*length;
14     int* a=new int[n];//初始化数组
15     cout<<"请输入数组中的元素:"<<endl;
16     for(int i=0;i<length;i++)
17     {
18         cin>>a[i];
19     }
20     int max=a[0];
21     int s=0;//定义求和后的元素
22      for(int i=0;i<length;i++)
23      {
24         s=0;
25         for(int j=i;j<length+i;j++)
26         {
27             s=s+a[j];
28             if(s>max)
29             {
30                 max=s;
31             }
32         }
33         a[length+i]=a[i];                                //每次将已经计算过的数放到最后
34      }
35      cout<<endl;
36      cout<<"最大子数组的和为:"<<endl;
37      cout<<max<<endl;
38
39     return 0;
40 }

四、运行结果

五、心得体会

这次的程序,在我刚刚看到的时候,简直一点思路都没有,所以最后采取的课堂上一个同学的思路,在编程的过程中我们还遇到了许多的问题,比如不知道如何把第一个数字移到数组的最后面,后来经过问同学,和我们自己的研究终于得到了解决。虽然我和我的小伙伴都不太会编程,但是我们还是努力完成了这个题目,也许这就是一点点的进步吧,在以后的过程中,我们会再接再厉,争取能够独立完成一个程序。

附上我和我的小伙伴的照片:

时间: 2024-12-17 10:59:37

返回一个整数数组(环形数组)中最大子数组的和的相关文章

返回一个整数数组中最大子数组的和(三)--环形

这次,在上次的要求中又多了一个条件 ——要求这个数组是环形的. 在上次的基础上,将这个代码进行改进,得到以下结果.下面把代码贴出来. 1 package yiweishuzu; 2 3 import java.util.Scanner; 4 5 public class shuzu_3 { 6 private static Scanner scan; 7 8 public static void main(String[] args) { 9 // 确定元素的个数 10 System.out.p

返回一个整数数组中最大子数组的和(环)

要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 结对开发:张子超 马思勉 刚看到这个题目首先想到的是将随机产生的数组复制一遍放在原数组后面,然后再进行求解,后来在和马思勉的探讨中得到新的解决思路,首先按照求解整数数组方法,

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

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大 两人结对完成编程任务.一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照).(截止到周四4月21日24:00) 二.设计思路 本次实验设计思路非常简单,就

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

返回一个整数数组中最大子数组的和4

题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二维数组首尾相接,象个一条首尾相接带子一样. 3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 4 求所有子数组的和的最大值.要求时间复杂度为O(n). 设计思想 目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案 源代码 题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二

返回一个首尾相接的二维整数数组中最大子数组的和

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math

定义一个由整数组成的数组,然后输入一个整数X,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j

//定义一个由整数组成的数组,然后输入一个整数x,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j: //若X在此数组中,则返回数组中这个数的位置. 源代码: #include<iostream> using namespace std; void main() { int array[]={1,2,3,4,5,6,7,89,45,32,56,78,12,43,90,19};//16个数字 int x; int max=array[0]; int min=array[0]

软件工程课堂练习:返回一个一维整数数组中最大子数组的和

题目:返回一个一维整数数组中最大子数组的和.要求:输入一个一维整形数组,数组里有正数也有负数.一维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 此次何琳琳负责程序分析,代码编程,张一博负责代码复审和代码测试计划. 经分析讨论设计思路如下: 1.定义一个长为20的数组,先对前10个数进行初始化,后10个数等于前10个数: 2.设置长度为10的循环依次以前十个数为头进行最大子数组的计算: 3,再设置一个数组用来存储

返回一个首尾相连的整数数组中最大子数组的和

一.题目:n返回一个整数数组中最大子数组的和. 二.要求: (1)n输入一个整形数组,数组里有正数也有负数. (2)n数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)n如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. (4)n同时返回最大子数组的位置. (5)求所有子数组的和的最大值.要求时间复杂度为O(n). 三.实验思路: 思路一:将一个数组的元素输入,构造一个新数组,新数组是由两遍输入的数组构成,