要求:
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)
附:
要求数组从文件读取。如果输入的数组很大,并且有很多大的数字,就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。任何输入错误都不能导致你的程序崩溃。
思路:
1、分析可知,数组中的第一个数据为一个子数组,从第二个数据开始往后每一个数有两种情况:
1)属于之前的子数组(即当该子数组之和加上这个数之后,大于当前数)。
2)新建一个子数组(即当之前的子数组之和加上这个数之后,小于当前数)。
(个人认为可以判断是否为正数即可)
2、遍历一遍数组,将所有可能是最大子数组的子数组的和存在相应子数组的最后一个位置。
3、遍历得出最大的子数组之和。
代码:
package com.me.array; import java.util.Scanner; public class ArrayMax { public static void main(String[] args) { int a[] = new int [100]; @SuppressWarnings("resource") Scanner sc=new Scanner(System.in); System.out.println("请输入数组长度"); int len = sc.nextInt(); System.out.println("请输入"+len+"个数字"); for(int i=0;i<len;i++) { a[i] = sc.nextInt(); } int max = maxSubSum(a,len); System.out.println("所有子数组的和的最大值为:"+max); } static int maxSubSum(int[] a,int length) { int i=0; int len = length; for(i=1;i<len;i++){ if(a[i]+a[i-1]>a[i]) { a[i]=a[i]+a[i-1]; } } int ans=-100000; for(i=0;i<len;i++) { if(ans<a[i]) { ans = a[i]; } } return ans; } }