设计思路:从第一个数开始陆续相加,若遇到负数,则用之前相加数的和与该负数进行比较,若两数相加之后数值大于零,则使两数相加进行后继运算,若小于零,则从负数的后一位开始新的运算,在此过程中,用一个参数记录每次运算后的最大值。
出现的问题:没有出现问题。在我看来缺陷就是没能同时把子数组输出。
解决方案:在进行运算和记录最大值的同时记录数组的下标。
源代码:
import java.util.*; public class ArrayMax { public static void main(String args[]) { Scanner input = new Scanner(System.in); System.out.print("请输入数组的长度:"); int n = input.nextInt(); int array[] = new int[n]; System.out.print("请输入数组:"); for(int i=0;i<n;i++) { array[i] = input.nextInt(); } int sum = 0; int max = 0; for(int i=0;i<n;i++) { if(array[i]>=0) { sum = sum + array[i]; } else { if(sum+array[i]>0) { sum = sum + array[i]; } else { sum = 0; } } if(sum>max) { max = sum; } } System.out.println("所有子数组的和的最大值为:"+max); } }
结果截图:
这是一个特殊情况,因为输出的是储存的最大值,所以就算最后几位都是负数,用该方法也能正确输出结果。