一、要求
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 }
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 }
四、实验截图
五、总结
本次实验用Java编的,但是还是没有解决问题,很遗憾,本次实验呢收获还是很大的,起初我们还是没有思路,当然最后有思路还是没有得出结果,我参考了
很多资料,许多都是发现溢出但是没有解决溢出,这是不对的。
以前写代码只考虑功能的实现,没有考虑过数值溢出,现在看来一个小小功能的实现要考虑太多太多的问题,在以后写代码的过程中我们也要多加注意这些问题,避免类似错误的发生。