子数组的最大累加和问题 JAVA代码实现
【问题描述】
给定一个一维数组,返回子数组的最大累加和。
例如,arraydemo=[1,-2,3,5,-2,6,-1];所有子数组中,[3,5,-2,6]可以累加出最大的和12,所以返回12。
【要求】
如果 arraydemo长度为N,要求时间复杂度为O(N),额外空间复杂度为O(1)
JAVA代码实现如下:
package com.bean.algorithmexec;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class SubArraySumDemo {
/*
* 给定一个一维数组,返回子数组的最大累加和。
* 例如,arraydemo=[1,-2,3,5,-2,6,-1];所有子数组中,[3,5,-2,6]可以累加出最大的和12,所以返回12。
*/
static int T, Answer;
static Scanner sc;
/*
* 算法函数
* */
public static int maxSum(int[] arraydemo) {
if (arraydemo == null || arraydemo.length == 0) {
return 0;
}
int max = Integer.MIN_VALUE;
int current = 0;
for (int i = 0; i != arraydemo.length; i++) {
current += arraydemo[i];
max = Math.max(max, current);
current = current < 0 ? 0 : current;
}
return max;
}
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
System.setIn(new FileInputStream("G:\\arraydemo.txt"));
sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String target = sc.nextLine();
String[] tempStringArray = target.split(" ");
int length = tempStringArray.length;
int demo[] = new int[length];
for (int i = 0; i < length; i++) {
demo[i] = Integer.parseInt(tempStringArray[i]);
// System.out.print("demo[" + i + "]= " + demo[i] + " ");
}
// System.out.println();
// 调用maxSum方法
Answer = maxSum(demo);
System.out.println("Answer = " + Answer);
}
}
}
算法设计
/*
* 算法设计(DP算法)
* Update 2019-05-04
* */
public static int maxSum(int[] nums) {
int dp[] = new int[nums.length];
int max = nums[0];
dp[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
dp[i] = Math.max(dp[i-1] + nums[i] ,nums[i]);
max = Math.max(max, dp[i]);
}
return max;
}
(完)