一、要求
1、题目:
返回一个整数数组中最大子数组的和。
2、要求:
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
二、设计思路
1、本题最难的是对于每个元素是int32 类型的,但要防止在运算时产生的数据过大而造成的溢出现象
2、设置一个临界值,将子数组的和与临界值作比较,如果大于临界值则将此值存放在另一个数组b[]内
3、存放后使sum=0,重复操作2,最后将b[]内的值输出
三、代码
1 package szys; 2 3 import java.util.Random; 4 import java.util.Scanner; 5 6 public class shuzu { 7 8 public static void main(String[] args) { 9 // TODO 自动生成的方法存根 10 11 sumN2(); 12 //int sum=MaxSubArraySum.sumN2(array); 13 //System.out.println("最大的子序列和="+maxSum); 14 } 15 public static void sumN2() 16 { 17 int M=1073741824; 18 int m,k; //m为数组内元素的个数 19 int array[]=new int[10000]; 20 int b[]={0}; 21 22 //Random r=new Random(); 23 Scanner n=new Scanner(System.in); 24 System.out.print("请输入数组内元素的个数:"); 25 m=n.nextInt(); 26 //int s=r.nextInt(100000); 27 System.out.print("请依次输入数组内元素:"); 28 for(k=0;k<m;k++) 29 { 30 array[k]=n.nextInt(); 31 } 32 System.out.print("数组内元素为:"); 33 for(k=0;k<m;k++) 34 { 35 System.out.print(array[k]+","); 36 } 37 System.out.println(); 38 int sum=0,maxSum=Integer.MIN_VALUE; 39 int count=0; 40 for(int i=0;i<m;i++) 41 { 42 sum=0; 43 for(int j=i;j<m;j++) 44 { 45 sum+=array[j]; 46 if(sum>maxSum) 47 { 48 maxSum=sum; 49 if(maxSum>M) //判断大于临界值就存放到数组b中 50 { 51 b[count]=maxSum; 52 count++; 53 sum=0; 54 } 55 56 } 57 } 58 } 59 System.out.print("最大的子序列和="+maxSum);// 60 for(int i=0;i<=count;i++) //输出b[]内的值 61 { 62 System.out.print(b[count]+" "); 63 } 64 } 65 66 }
四、实验截图
五、总结
遗憾的是最终还是没有能够很好地解决数溢出的问题,但在编写的过程中,想了很多解决方案,测试了很多次程序,虽然没有做出来
但是过程还是很让我感到欣慰的!自己还有许多地方需要学习。