题目:返回一个整数数组中最大子数组的和。
要求: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)
一开始没有考虑时间复杂度,直接想到了把输入的数组直接求出他们的子数组的和并输出他们的最大值,比较容易想到但是要用到多次for循环,输入数组,利用双循环来求出连续子数组的和,最后再用一次for循环来输出最大值。
后来在网上找到一种想法,即先累加,如果累加值为负数则后面的的和一定不包含之前的累加值,把此时的值赋值为0,再接着累加,这样就可以求出最大的累加值,即最大连续数组的和:
package a; import java.util.Scanner; public class uuu { public static void main(String[] args){ int number,maxsum,maxstart; int i; Scanner in = new Scanner(System.in); System.out.println("请输入数组的大小:"); number=in.nextInt(); int a[]=new int[number]; System.out.println("请输入数组的值:"); for(i=0;i<number;i++) { a[i]=in.nextInt(); } maxsum=a[0]; maxstart=a[0]; for(i=0;i<number;i++) { if(maxstart<0) { maxstart=0; } maxstart+=a[i]; if(maxstart>maxsum) maxsum=maxstart; } System.out.println("最大子数组和为"+maxsum); } }