最大连续子数组和与JUnit测试

  • 【题目】最大连续子数组和(最大子段和)


  • 背景

    问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为:Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
    例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
    -- 引用自《百度百科》

  • 具体要求

    1. 要求写出可运行的完整代码提交至GitHub或者Coding.net系统中,并将代码地址附到博客内。
    2. 请从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖五个覆盖标准中,任选一个标准设计测试用例。
    3. 请利用自动测试工具对程序进行测试。
    4. 请将程序运行结果和自动测试分析结果截图附到博客中。
  • 算法与代码实现

    抛弃的算法:通过题目要求,首先想到的是暴力求解,即利用循环,求出每一个子数组的值并进行比较,求出其中子数组的最大值。但是由于此方法效率较低,于是思考下一个方法。

    新的算法:我们首先分析出,当子数组和最大时,该子数组的首位和末位(存在的情况下),一定应为正值,且该子数组一定需要大于零才可作为新的最大的子数组并继续向下运算;否则,我们将抛弃他,并以下一位作为新的运算子数组。我们设每次运算的子数组为ThisSum,新的临时最大的子数组为MaxSum,根据此特性,可以列出公式:Array[i] = MAX(Array[i-1] + A[i] , A[i])

根据上述公式,已将具体代码提交到GitHub上,便不在此赘述,点此查看Github源代码。

  • 流程图与测试

根据写出的代码,画出流程图如下:

为了寻求合适而全面的测试样例,我找出循环内部的两条判断语句的流程,选用条件覆盖。

线段号 ThisSum>MaxSum ThisSum<0
Blue1 Yes
Yellow2 No Yes
Red3 No No

选用的测试样例数组如下:

数组 备注
Array1:{ } 取边界值?测试
Array2:{1,-2,3,4,-5} 1->2->1->1->3
Array3:{1,2,3,4,5} 辅助测试
Array4:{-1,-2,-3,-4,-5} 全为负值 故最大为?

测试结果如下:
Array1:

Array2:

Array3:

Array4:

自动单元测试JUnitTest结果如下:

到此,对最大连续子数组求和的内容结束。

原文地址:https://www.cnblogs.com/cocoaman/p/10729553.html

时间: 2024-10-04 07:11:23

最大连续子数组和与JUnit测试的相关文章

java---最大连续子数组和(最大子段和)

1.题目要求 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+-+a[j]},1<=i<=j<=n 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20. 2.代码实现 代码参考于这篇文章. public class

剑指Offer面试题:28.连续子数组的最大和

一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18. 这个题目在我去年参加校园招聘时,某公司的二面采用了机试,而题目刚好就是这道题.一般看到这道题目就会想到枚举出数组的所有子数组并求出它们的和.一个长度为n的数组,总共有n(n+1)/2个子数组.计算

Task 4 求数组的连续子数组的最大和(团队合作)

小组成员:李敏.刘子晗 1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可.我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能.先要定义数组长度和上下限的变量,然后通过if语句对用户所给出的长度和数值进行判断看是否合法,如果不合法要重新输入.最后再加上之前求和的相应代码即可. 2.出现的问题:我们达成协议后,李敏负责编程,我负责测试.开始写程序,在写判断数值是否满足int整型范围的时候出现了错误,我在测试的时候发现她把小于号错写成了大于号,然后加以改正

剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)

题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组测试数据包括两行. 第一行为一个整数n(0<=n<=100000),当

剑指offer系列源码-最大子向量和(连续子数组的最大和)

题目1372:最大子向量和(连续子数组的最大和) 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2169解决:570 题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)

分治策略求解数组的最大连续子数组的和

对于一个数组,尽可能地划分成两半(二分),加和最大的连续字数组或者在左边,或者在右边,或者跨越中间,一部分在左边,一部分在右边. 那么只要求出左半段数组的加和最大的连续子数组的和,求出右半段数组的加和最大的连续子数组的和,求出跨越中间的最大连续字数组的和,只要通过三者判断求出最大的那么就是整个数组最大的连续子数组的和. 那么找出左半段和右半段的最大连续子数组的和其实就是比原问题规模更小的一个问题,因此对于左半段和右半段求解加和最大的连续子数组的和可以通过递归求得. 下面给出具体实现:. 首先是调

连续子数组最大和(转)

求一个数组的相加和最大的连续子数组 思路: 一直累加,只要大于0,就说明当前的“和”可以继续增大, 如果小于0了,说明“之前的最大和”已经不可能继续增大了,就从新开始, result=max{result+arr[i],arr[i]};显然,若result>0,则可以继续相加,否则,就重新开始. #include<stdio.h> #define INF 65535 int Maxsum(int * arr, int size) { int maxSum = -INF; int sum

连续子数组的最大和Java实现

问题描述: 一个数组有 N 个元素,求连续子数组的最大和. 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3 本文采用的是数组,利用等差数列进行求和,代码如下: package series00; import java.util.Arrays;import java.util.Scanner; public class series1 { public static void main(String[] args) { //准备数据 System.out.println("请

求连续子数组的最大和

一.题目: 这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组.比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8. 二.解法: 解法一:暴力求解法 /* (1) 常规方法,时间复杂度O(n*n) (2) 先从第一个元素开始向后