题目要求:返回一个整数数组中最大子数组的和
具体要求:输入一个整形数组,数组里有正数也有负数;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值。要求时间复杂度为O(n);
发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。
1.设计思想:
设定三个变量,分别是max(子数组中的和的最大值,初始值为0)、result(当前子数组的和,初始值为0)、number(数组长度,初始值为0)。
先让用户自己设定数组的长度,之后输入数组。从数组第一位开始遍历数组,result=result+当前数值,并判断:
①若result>max,则令max=result;
②若result<0,则result=0。
最后当循环运行结束后,输出最后max的值。
2.出现的问题:
若输入值均为负数,则无法正确输出结果。
3.可能的解决方案:
在输入整个数组后,将max值赋值为a[0]。
4.源程序:
1 package text; 2 3 import java.util.*; 4 public class MaxResult 5 { 6 public static void main(String args[]) 7 { 8 int max=0,number=0,result=0; 9 Scanner in=new Scanner(System.in); 10 System.out.print("请输入需要的数组长度:"); 11 number=in.nextInt(); 12 13 int a[]=new int [number]; 14 15 System.out.print("请输入一个长度为"+number+"的数组(输入范围:自然数):"); 16 for(int i=0;i<number;i++) 17 { 18 a[i]=in.nextInt(); 19 } 20 21 max=a[0]; 22 23 for(int i=0;i<number;i++) 24 { 25 result=result+a[i]; 26 27 if(result>max) 28 { 29 max=result; 30 } 31 if(result<0) 32 { 33 result=0; 34 } 35 } 36 37 System.out.println("该数组中相邻的元素所组成的子集的和中,最大值为:"+max); 38 } 39 }
5.结果截图:
6.总结
在时间复杂度限制的情况下,尽可能使用简单的方法去完成题目要求,在每一次循环中要把各种情况全都考虑到,充分利用每次一循环,这一点至关重要。