题目:返回一个整数数组中最大子数组的和。
要求: 输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
设计思想:手动输入若干个整数(n个),然后从第一个数开始,用第一个数每次多加后面的一个数得到和sum,将sum与之前的sum比较,若后得到的大,则sum的值为后得到的sum。当sum为第一个数至最后一个数之和时,将得到的数赋予数组max【0】用来存放以第一个数开头的最大值。之后再从第二个数开始,执行上述步骤。直到进行到第n-1个数进行完毕,我们也就得到了数组max【】;而所有的子数组的和的最大值必然存在于数组max中。所以再对max数组的每个元素进行比较,选出最大值就OK了。
在这期间出现了数组没有初始化的问题,之后对其进行了循环赋值为0;还有各个数组之间赋值出错的问题,理清思路后得以解决。
代码如下:
package com.two; import java.util.*; /* * 寻找各个数开头的最大值,进行比较 * * */ public class two { /*public static int sum() { return max1; }*/ public static void main(String[] args) { Scanner input=new Scanner(System.in); int n=0; System.out.print("请输入数的个数:"); n=input.nextInt(); System.out.print("请输入"+n+"个数:"); int a[]=new int[5]; for(int i=0;i<5;i++) { //输入 a[i]=input.nextInt(); } int max[]=new int[a.length]; for(int i=0;i<max.length;i++) { max[i]=0; } int sum=0; for(int i=0;i<a.length;i++) { //以各个数开头的最大值 max[i]=a[i]; sum=max[i]; if(i<a.length) { for(int j=i+1;j<a.length;j++) { sum=sum+a[j]; if(max[i]<sum)max[i]=sum; } } } int max1=max[0]; for(int i=1;i<max.length;i++) { if(max1<=max[i]) { max1=max[i]; } } System.out.println(max1); } }
截图:
总结:一定要理清思路,之后就很容易了。