算法复习------求数组的最大子序列

时间:2021-11-12 00:41:41

问题描述:

一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3 

输入描述:
输入为两行。
第一行一个整数n(1 <= n <= 100000),表示一共有n个元素
第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:
所有连续子数组中和最大的值。
输入例子:
3
-1 2 1

输出例子:
3
代码试下如下,细节问题处理起来麻烦,做法很好有思路
import java.util.*;
public class TestDemo1
{
public static void main(String []args)

{
//输入一个整数
System.out.println("请输入数组长度:");
Scanner scanner =new Scanner(System.in);
int n =scanner.nextInt();
int [] arry =new int[n];

System.out.println("请输入数组中每个元素:");
//请输入数组中的每个数值
for(int i=0;i<n;i++)
{
System.out.println("a["+i+"]=");
arry[i]= scanner.nextInt();

}
getMaxLine(arry);

}

//获取数组中连续最大子序列 即子序列和最大 并且输出最大和
public static void getMaxLine(int []arry)
{
boolean flag =false;
for(int i=0;i<arry.length;i++)
{
if(arry[i]>0)
{
flag=true;

}
}
if(flag)
{

//当数组中存在正数的时候和最大默认maxSum
int maxSum =0;
//创建第一个数组元素起始的所有相连子数组的和
int [] sum =new int [arry.length];
int i=0;
while(i<arry.length )
{
//System.out.println("arry["+i+"]="+arry[i]);
if(i==0)
{
sum[i]=arry[0];
}else{

sum[i]=sum[i-1]+arry[i];
}
i++;
}
//求出sum[]数组中最大值
int maxIndex=getMaxN(sum,sum.length);
//求出sum[]数组中最大值下标之前的最小值
int minIndex =getMinN(sum, maxIndex+1);
System.out.print("最大子序列为:");
//输出最大子序列
for(int j=minIndex+1 ;j< maxIndex+1;j++)
{

maxSum +=arry[j];
System.out.print (arry[j]);

}
System.out.println("");
//"最大子序列的和为:"+
System.out.println("数组中的最大子序列的和为为:"+maxSum);
}else {
//当数组中没有正数的时候 相邻的子序列相加不会变大 所有就直接输出数组中最大的元素即最大子序列
int index = getMaxN(arry, arry.length);
System.out.println("数组中的最大子序列为:"+arry[index]);
System.out.println("数组中的最大子序列的和为为:"+arry[index]);
}

}


//求数组中前n个数中的最大数
public static int getMaxN(int arry[],int n)
{
int max=arry[0];
int index=0;
for(int i=1;i<n;i++)
{
if(arry[i]>max)
{
max=arry[i];
index=i;
}

}
return index;

}
//求数组中前n个数中的最小数
public static int getMinN(int []arry,int n)
{
int min=arry[0];
int index=0;
for(int i=1;i<n;i++)
{
if(arry[i]<min)
{
min=arry[i];
index=i;
}

}
return index;

}

}