题目:返回一个一维整数数组中最大子数组的和。
要求:
输入一个一维整形数组,数组里有正数也有负数。
一维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
设计思想:
生成数组,生成子数组,求和,求最大值。
代码:
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);
}
}
截屏 :
总结:
子数组的生成:当累加和小于零是不能是值增大,重置。
扩展可以显示和最大的子数组,及其开始结束下标。
团队照片: