JAVA算法:子数组的最大累加和问题

子数组的最大累加和问题 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;
	}

(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值