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 MaxArry {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int[] array = {-2,11,-4,13,-5,-5,-2};
        int result = maxSunArray(array);
        System.out.println("连续子数组之最大和为:"+result);
    }

    public static int maxSunArray(int[] array) {
        if (array.length==0 || array==null) {
            return 0;
        }
       int Sum = 0;
       int max = 0;
       for (int i = 0; i < array.length; i++) {

           if(Sum<=0){      //如果当前连续n项的和小于等于0,则没必要与后面的元素相加
               Sum = array[i];      //Sum重新赋值
           }else{
               Sum += array[i];     //如果Sum的值大于0,则继续与后面的元素相加,
           }
           if(Sum>max){         //每次改变Sum的值都有与max进行比较
               max = Sum;       //如果Sum的值大于max,则将Sum的值赋值给max
           }
       }
       return max;
    }
}

代码中只用了一个for循环,所以其算法的时间复杂度为O(n)。

代码已上传到coding.net

3.单元测试选择:条件组合覆盖

覆盖标准:

使得每个判定中条件的各种可能组合都至少出现一次。

其中条件选择的程序流程图如下

条件组合 执行路径
sum<=0,sum>max abdef
sum>0,sum>max acdef
sum>0,sum>=max acdf
sum<=0,sum>=max abdf

测试数据只需要一组[1,2,-3,2]即可实现上述四种执行路径

4.测试代码

 import static org.junit.Assert.*;

import org.junit.Test;

public class ArrayMaxTest {

    int[]  array={1,2,-3,2};
    @Test
    public void MaxSunArrayTest() {
        assertEquals(3,new ArrayMax().maxSunArray(array));
    }

}

测试结果

原文地址:https://www.cnblogs.com/liu-ya/p/8665175.html

时间: 2024-10-01 19:58:13

java---最大连续子数组和(最大子段和)的相关文章

连续子数组的最大和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("请

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),当

求连续子数组的和最大

题目描述:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 我们可以使用分治法或者减治法来处理这个问题. 分治法    目标:把1个大问题分成2个小问题,2个小问题还可以再分,直到问题规模小的可以简单解决. 将该数组等分成两个子数组,假如知道左右两侧两个数组的各自的最大子数组和,那么整个数组的最大子数组和可能为三种情况: 右侧数组的最大子数组和 左侧数组的最大子数组和 左右两侧数

求解最大连续子数组和问题

前言 最近工作不是特别忙,所以有更多时间来学习算法相关知识,补短处.题目来源于leetcode,通过一个算法题,我们去分析该算法题所属类型,以及解题思路,以及该算法题所用到的数学知识.选择的算法题目从容易到困难,逐步提高难度,解题的思路也是从简单到复杂,时间复杂度也是从低到高的顺序来书写这个系列的博客.因工作语言和使用熟练度原因算法采用Java编写,但该系列中可能会穿插c.C++.python语言实现,请不要奇怪. 题目 分析题目:给定的整型数组,求解最大连续子数组和,要求是至少包含一个元素,且

返回一个数组的连续子数组和的最大值

package wodeshiyao; import java.util.Scanner; public class lalala { static Scanner scan=new Scanner(System.in); public static void main(String[] args) { // TODO Auto-generated method stub int b; System.out.println("请输入数组长度:"); b=scan.nextInt();

求环形连续子数组的和的最大值

课上老师把连续子数组求和的题目改为让子数组首尾相接再求最大子数组的和. 我的处理方法:新建一个二倍原数组长度b的数组d[  ],然后从d[0]到d[b]分别生成b个分数组,再分别求子数组和,再比较. package wodeshiyao; import java.util.Scanner; public class shiyan321 { static Scanner scan=new Scanner(System.in); public static void main(String[] ar

最大连续子数组和与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. -- 引用自<百

【剑指offer】面试题 42. 连续子数组的最大和

面试题 42. 连续子数组的最大和 NowCoder 题目描述 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 注意: 要求时间复杂度为 O(n). Java 实现 public class Solution { public int FindGreatestSumOfSubArray(int[]