一维数组子数组最大和

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

要求:

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

一维数组首尾相接,象个一条首尾相接带子一样。

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

求所有子数组的和的最大值。

设计思想:

生成数组,生成子数组,求和,求最大值。

代码:

package bao;
import java.util.*;
public class Msum
{
	public static void main(String args[])
	{
		Scanner input=new Scanner(System.in);
		System.out.println("请输入一维数组元素个数:");
		int num=input.nextInt();
	    int Array[]=new int[num];
	    for(int i=0;i<num;i++)
        {
            if((int)(Math.random()*2)==0)
            {
                Array[i]=(int)(Math.random()*30);//30元素最大值
            }
            else
            {
                Array[i]=-(int)(Math.random()*30);
            }
        }
        for(int i=0;i<num;i++)
        {
            System.out.println(Array[i]);
        }
        //sun[]子数组,Sum子数组元素和,找最大值maxSum
        int Sum=0,maxSum=0;
        int i=0;
        for(i=0;i<num;i++)
        {
        	Sum+=Array[i];//累加
        	if(Sum<0)//当前和小于0,重置
        	{
        		Sum=0;

        	}
        	if(Sum>maxSum)
        	{
        		maxSum=Sum;
        	}
        }
        if(maxSum==0)//最大和依然为0,说明数组中元素都为负值
        {
        	maxSum=Array[0];
        	for(i=0;i<num;i++)
        	{
        		if(Array[i]>maxSum)
        		{
        			maxSum=Array[i];//最大元素即为maxSum
        		}
        	}
        }
        //输出maxSum
        System.out.println("最大子数组之和:"+maxSum);

	}

}

截屏 :

总结:

子数组的生成:当累加和小于零是不能是值增大,重置。

扩展可以显示和最大的子数组,及其开始结束下标。

时间: 2025-01-01 21:14:16

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

一维数组子数组之和

题目:返回一个一维整数数组中最大子数组的和. 要求: 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 设计思想: 生成数组,生成子数组,求和,求最大值. 代码: package bao; import java.util.*; public class Msum { public static void main(String args[]) { Scanne

二维数组子数组最大和

1.结组成员 周盼超.张晨建 2.实现功能 随机产生一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 3.设计思路 我感觉,这应该是最笨的方法了吧,我们用了用了四个for嵌套.思路很简单:每一行每一行的求最大子数组和即看成n个一维子数组求最大子数组和,记录结果,然后把两行看做一行上下两个数相加,每两行两行求最大子数组和,然后三行,四行,n行. 4.完整代码 package 二维数组; import java.u

环状连续数组,求子数组最大和

今天看到环状连续数组求子数组最大和的题目,看了几篇博客,但是好像有问题,可以举出反例.于是参考其他人的博客自己又总结下. 首先,求非环状的数组中子数组 最大和问题是一个动态规划的思想. sum[i] = max(sum(i-1) + a[i], a[i]); sum[i]代表以i元素结尾的子数组的最大和,sum[i-1]代表以i-1元素结尾的子数组的最大和,a[i]代表第i个元素的值,由此公式可得,以第i个元素结尾的子数组的最大和可以由它之前的以第i-1个元素结尾的子数组的最大和推导出.如果以i

连续子数组最大和(转)

求一个数组的相加和最大的连续子数组 思路: 一直累加,只要大于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

Maximum Subarray 连续子数组最大和

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum = 6. More practice: If you have figur

结对开发首尾相接数组求子数组最大和

组员:燕亚峰  20122914           王童博   20122823 一.题目及要求: 返回一个整数数组中最大子数组的和 如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大:同时返回最大子数组的位置. 二.设计思路: 对于这题本想延用一维数组的方法,不过由于数组进行了整合,始末位置无法判断.所以此种方法断然没有实现. 可以形成一个固定长度的窗口,依次相加比较. 首先将为两种情况,一种是跨越a[n-1],a[0]的.一种

首尾相接数组求子数组最大和

一.题目及要求: 返回一个整数数组中最大子数组的和 如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大:同时返回最大子数组的位置. 二.设计思路: 对于这题本想延用一维数组的方法,不过由于数组进行了整合,始末位置无法判断.所以此种方法断然没有实现. 小伙伴曾说延用课上学生提供的方法,形成一个固定长度的窗口,依次相加比较.这不失为一个好方法.只可惜时间复杂度不是n. 于是上网查了点资料.思想有点引用网上的了.首先将为两种情况,一种是跨

返回二维数组子数组联通和最大

分析 1,开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0: 2,将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值: 3,取以每个点为起点遍历的和的最大值即时最大联通子数组的和.遍历时,选取已遍历的联通子数组周围最大值遍历.经过重复的几次遍历就可以确定此数组中最大连通数组和了. 题目要求: 放在一个input.txt的文件中 数组里面有正数有负数 返回联通子数组和最大的值 #include<fstr

最大和子数组/最大和子序列

最大和子数组是数组中和最大的子数组,又名最大和子序列.子数组是数组中连续的n个元素,比如a2,a3,a4就是一个长度为3的子数组.顾名思义求最大和子数组就是要求取和最大的子数组. n个元素的数组包含n个长度为1的子数组:{a0},{a1},…{an-1}: n个元素的数组包含n-1个长度为2的子数组:{a0,a1},{a1,a2},{an-2,an-1}: ……………………………………………………………………………………………… n个元素的数组包含1个长度为n的子数组:{a0,a1,…,an-1