求子数组最大和(java)
【问题描述】给定一个数组,求数组中某一段元素和的最大值。注意这一段元素是连续的。如 [31,-41,59,26,-53,58,97,-93,-23,84],的最大和是187=59+26+(-53)+58+97
【输入形式】第一行输入数组长度N(0<N<=20000)后面N行输入数组元素
【输出形式】输出子数组的最大和
【样例输入】
10
31
-41
59
26
-53
58
97
-93
-23
84
【样例输出】
187
问题分析
1.对于这样的题目,暴力枚举也能解决,但是为了效率,我们可以选择动态规划去解决这类问题,将时间复杂度降低到O(n)。
具体代码
package test3;
import java.util.Scanner;
public class Max {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[]arr=new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i]=in.nextInt();
}
int pre=arr[0],max=0;
for (int i = 1; i < arr.length; i++) {
pre=Integer.max(pre+arr[i], arr[i]);
max=Integer.max(max, pre);
}
System.out.println(max);
in.close();
}
}