1.问题
返回一个整数数组中最大子数组的和。
要求: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。
2.问题分析和设计思想
拿到这个问题首先是要有一个整形的数组,这个数组中有正数也有负数,并且概率完全相同。这就要用到生成随机数的Math.random()方法产生一个随机数,这个随机数有正有负,就用到一个if语句来决定这个随机数是正是负。最核心的是一个三层循环,最外层循环控制数组的头,中间层控制循环数组的尾,最内层控制数组从头加到尾。这样就实现了求全部子数组的和。然后通过不断比较就得到了最大子数组的和。
3.源代码
package shuzhu; import java.util.*; public class shuzhu { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.print("请输入数组中数的个数:"); int num=input.nextInt(); int max=0; int a[]=new int[num]; for(int i=0;i<num;i++)//循环生成num个随机数 { if((int)(Math.random()*2)==0)//先从0或1之间生成一个数,进而决定这个数的正负 { a[i]=(int)(Math.random()*10); } else { a[i]=-(int)(Math.random()*10); } } for(int i=0;i<num;i++)//循环输出生成的num个随机数 { System.out.println(a[i]); } for(int b=0;b<num;b++)//最外层循环控制这个子数组的头 { for(int c=b;c<=num;c++)//中层循环控制这个子数组的尾 { int sum=0; for(int d=b;d<c;d++) //内层循环从头加到尾 { sum=sum+a[d]; if(max<=sum)//通过比较把最大的子数组和赋给max { max=sum; } } } } System.out.print("子数组和的最大值为:"+max); } }
4测试截图
5总结
我的这个是最笨的办法实现的这个程序,就是把全部可能的情况求出比较,要另外学习别人先进的思路方法。多多练习。