课堂练习——返回一个整数数组中最大子数组的和

题目要求:返回一个整数数组中最大子数组的和

具体要求:输入一个整形数组,数组里有正数也有负数;
     数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
     求所有子数组的和的最大值。要求时间复杂度为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.总结

在时间复杂度限制的情况下,尽可能使用简单的方法去完成题目要求,在每一次循环中要把各种情况全都考虑到,充分利用每次一循环,这一点至关重要。

原文地址:https://www.cnblogs.com/Daddy/p/5359941.html