最大子数组求和问题

一、题目与要求

  题目:

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

要求:

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

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

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

结对编程要求:

         1.两人结对完成编程任务。

        2.一人主要负责程序分析,代码编程。

        3.一人负责代码复审和代码测试计划。

        4.发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。(截止到周四3月19日24:00)

二、设计思想

   初看程序感觉不是很难,但是由于题目中要求的时间复杂度为o(n),在满足这一条件的基础上解决该问题存在一定的难度,利用普通的遍历求最大子数组的方法在这里已经不在试用,所以就必须寻找一种查找算法可以实现时间复杂度为o(n)。

三、源代码

 1 /*======================================================================
 2             # Author: ZhangYaPeng
 3             # E-Mail: [email protected]
 4             # Last modified: 2015-03-17 20:23
 5             # Filename: Demo.cpp
 6             # Description: count the max sum of the sub Array.
 7 ======================================================================*/
 8 # include <iostream>
 9 #define LENGTH 5                                //定义出数组的长度
10 using namespace std;
11
12 //求两个数字的最大值
13 int Max(int  a,int  b,int c)
14 {
15     int temp = a>b?a:b;
16     int max = temp>c?temp:c;
17     return max;
18 }
19
20 //求最大子数组的和
21 int SelectMaxArr(int  arr[],int left,int right)
22 {
23     if(left == right)                                    //嵌套结束条件
24     {
25         if(arr[left] > 0)
26             return arr[left];
27         else
28             return 0;
29     }
30     int maxMidLeft,maxMidRight;                //存放包含中点的左右部分的最大值
31     int TempLeft,TempRight;                    //存放中点左右部分的最大值
32     int maxLeft,maxRight;                        //存放最终该嵌套层中左右部分的最大子数组的和
33     int mid;                                                //存放每次嵌套的中点
34     mid = (left+right)/2;
35     maxMidLeft = 0;
36     maxMidRight = 0;
37     TempLeft = 0;
38     TempRight = 0;
39     for(int i = mid;i >= left;i--)                //从中点作为边界开始求其两边最大的子数组并依次递归(左侧部分)
40     {
41         TempLeft += arr[i];
42         if(maxMidLeft < TempLeft)
43         {
44             maxMidLeft = TempLeft;
45         }
46     }
47     for(int i=mid+1;i<=right;i++)            //从中点作为边界开始求其两边最大的子数组并依次递归(右侧部分)
48     {
49         TempRight += arr[i];
50         if(maxMidRight < TempRight)
51         {
52             maxMidRight = TempRight;
53         }
54     }
55     //递归计算左右两部分的最大子数组的和
56     maxLeft = SelectMaxArr(arr,left,mid);
57     maxRight = SelectMaxArr(arr,mid+1,right);
58     return Max(maxLeft,maxRight,maxMidLeft+maxMidRight);
59 }
60
61 //测试函数
62 int main()
63 {
64     int Arr[LENGTH];
65     int max;                    //存放最大子数组的和
66     cout<<"请输入"<<LENGTH<<"个整数(可正可负):";
67     for(int i=0;i<LENGTH;i++)
68     {
69         cin>>Arr[i];
70     }
71     max = SelectMaxArr(Arr,0,LENGTH-1);
72     cout<<"该数组中最大子数组的和为:"<<max<<endl;
73     return 0;
74 }

四、运行结果

五、结果测试

  1.数组元素均为有序正数

  

  2.数组元素均为乱序正数

  

  3.数组元素均为有序负数

  

  4.数组元素为乱序负数

  

  5.数组元素为正负混合

  

六、结果测试

  在本次结对开发中,我和田永涛同学刚开始各自阐明了自己对个题目的看法,每个人的想法肯定不完全相同,所以我们积极讨论寻找最优的解决办法,若该题目不考虑时间复杂度为o(n)的对可以通过基层嵌套来实现,思路上并不复杂,之所以难解决就是因为对一些快速高效的查找算法了解不充分的原因。

  在编写代码的时候,我们分工明确,我代码编写田永涛负责代码的错误提示以及相关的优化,这样写代码效率可能并没有很明显的提升,但是代码中的一些编写规范会实现的很好,之所以效率不高也可能是因为第一次尝试这种结对开发的模式,相信在以后这种练习的次数多了之后,效率上会有较为明显的提升。

  

时间: 2024-11-06 16:37:25

最大子数组求和问题的相关文章

环状二维数组最大子数组求和

题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样. n数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 结对开发过程: 这次的编程开发是基于上次的以为数

首尾相连的二维数组最大子数组求和

题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样. n数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 结对开发过程: 这次的编程开发是基于上次的以为数

软件工程结对开发——一维最大子数组求和溢出问题

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 将数组第一个和第二个数置为2的63次方,观察结果是否溢出. 三.源代码 1 package com.java.lianxi; 2 3 import java.util.Scanner; 4

最大子数组求和并进行条件组合覆盖测试

简介 算法导论第四章介绍过使用分治法求最大子数组问题,其基本思想就是把一个数组分成三部分,a[0:n/2],a[n/2+1:n],a[j:k] (其中0<=j<=n/2,n/2+1<=k<=n),通过递归分别求出他们的最大子数组和,然后再从中挑出最大的一个值,即为该数组的最大子数组值,该算法的时间复杂度为O(nlogn) 白盒测试有语句覆盖.判定覆盖.条件覆盖.判定/条件覆盖.条件组合覆盖这五个覆盖标准 环境:Ubuntu 16.04 语言:C++ 测试工具:GTest(Gtest

eclipse的安装及最大子数组求和

我安装的是eclipse.由于eclipse是一个基于Java的课扩展开发平台,所以在安装eclipse之前要先安装Java的开发工具JDK(Java Devolopment Dit),且安装JDK需要配置环境变量. 首先要下载JDK.下载JDK是为了安全起见,尽量在Oracle官网下载,官网地址是:http://www.oracle.com/    下载时需要用户登录,可以免费注册然后就能下载了. 打开官网后会看到如下界面,首先将光标放到Downloads的位置,在其显示的页面找到 Java

二维数组中最大子数组的和

题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 借鉴网上代码整理得思路: 根据一位数组最大子数组求和的编程思路,讲二维数组转化成一维数组求解: 即求出每一行的最大子数组之和,通过比较各行最大子数组之和的大小,求出只有二维数组只有一行的情况下的最大子数组之和: 然后求每两行最大子数组之和,即将每两行的相同列相加,将二维数

循环数组,求和最大子数组

题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 1. a.定义长度为n的一维数组,实际随机生成的时候生成长度为2n的数组,即n+1~2n是对1~n的重复 b.利用长度为n时的求法

结对开发——返回整数数组最大子数组和2

返回整数数组最大子数组和2 为了实现“敏捷开发”的目的,老师让我们采取“迭代”的方法进行项目的开发,这不,对于周一的求最大子数组和又有了新的要求,如下: 1.延续上次的要求,这里不再赘余… 2.如果数组A[0]……A[j-1]首尾相连,允许A[i-1],……A[n-1],A[0]……A[j-1]之和最大: 3.同时返回最大子数组的位置: 4.要求程序必须能处理1000 个元素,且每个元素是int32 类型的. 一.实验设计思路 首先实现的是数组首尾相连,先存入数组,再将原数组反向存储形成环形数组

二维数组求最大子数组

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