题目:返回一个整数数组中最大子数组的和。
要求: 输入一个整型数组,数组里有正数也有负数;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值。要求时间复杂度为O(n);
一、设计思想
1.首先随机产生一个数组,数组长度可自行输入,该数组里有正数也有负数。
2.从数组中第一个元素a[0]开始,依次计算a[0]、a[0]+a[1]、a[0]+a[1]+...+a[i]的值,即从a[0]开始的每个子数组的和,取出最大值。
3.再从数组第二个元素a[1]开始,依次往后计算每个子数组的和,取出最大值。
4.依次循环,循环num次,直到数组最后一个元素,将每次求得的最大值存到一个数组list[]中。
5.比较每次得出的子数组的和的最大值,再得出最大值。
二、源程序
1 //作者:王雪青 陆宇
2 //日期:2015年3月18日
3 package com.java.lianxi;
4
5 import java.util.*;
6 public class lianxi2
7 {
8 public static void main(String[] args)
9 {
10 Scanner input=new Scanner(System.in);
11 System.out.print("请输入数组中数的个数:");
12 int num=input.nextInt();
13 int array[]=new int[num];
14 for(int i=0;i<num;i++)
15 {
16 if((int)(Math.random()*2)==0)
17 {
18 array[i]=(int)(Math.random()*10);
19 }
20 else
21 {
22 array[i]=-(int)(Math.random()*10);
23 }
24 }
25 for(int i=0;i<num;i++)
26 {
27 System.out.println(array[i]);
28 }
29 int max=0;
30 int list[]=new int[num];
31 for(int j=0;j<num;j++)
32 {
33 max=array[j];
34 int sum=0;
35 for(int t=j;t<num;t++)
36 {
37 sum=sum+array[t];
38 if(sum>max)
39 {
40 max=sum;
41 }
42 }
43 list[j]=max;
44 }
45 for(int i=0;i<num;i++)
46 {
47 System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:");
48 System.out.println(list[i]);
49 }
50 for(int i=1;i<num;i++)
51 {
52 max=list[0];
53 if(list[i]>max)
54 {
55 max=list[i];
56 }
57 }
58 System.out.print("子数组和的最大值为:"+max);
59 }
60 }
61
三、运行结果截图: