计算数组的最大子序列之和

问题描述:

计算一个给定数组的最大子序列之和

分析:

有三种方法:

1,扫描3遍,可以计算所有的子序列之和,但是复杂度为N^3。

2,扫描2遍,计算以任意元素开始的和,如果大于当前的最大值则将最大值付给它,复杂度为N^2。

3,扫描一遍,计算任意元素开始的值,如果小于零则清零,否则继续往后加。

代码实现:

package c02;

/**
 * @project: DataStructureAndAlgorithmAnalysis
 * @filename: MaxSubSum
 * @version: 0.10
 * @author: Jimmy Han
 * @date: 21:35 2015/7/7
 * @comment: 以每一个元素为起点计算往后的和,如果为负,则重新开始计算
 * @result: 10
 */
public class MaxSubSum {
    public static void main(String[] args){
        int[] arr = {-1, 3, 2, -3, -1, 4, 5};
        System.out.println(maxSubSum(arr));
    }

    public static int maxSubSum( int[] a){
        int maxSum = 0, thisSum = 0;

        for(int j = 0; j < a.length; j++){
            thisSum += a[j];

            if(thisSum > maxSum)
                maxSum = thisSum;
            else if(thisSum < 0)
                thisSum = 0;
        }

        return maxSum;
    }
}
时间: 2024-10-09 00:05:38

计算数组的最大子序列之和的相关文章

POJ C++程序设计 编程题#5 计算数组的低3位之和

编程题#5:计算数组的低3位之和 来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 总时间限制: 1000ms 内存限制: 1024kB 描述 输入一个正整数构成的数组a[0], a[1], a[2], ... , a[n-1], 计算它们的二进制低3位之和. #include <iostream> #include <vector> #include <algorithm> using nam

编程之美之2.14 求数组的子数组之和的最大值

[题目] 一个有N个整数元素的一维数组(A[0],A[1],A[2],...A[n-1]),这个数组中当然有很多子数组,那么子数组之和的最大值是多少? 该子数组是连续的. 我们先来明确一下题意: (1)子数组意味着是连续的. (2)题目只需要求和,并不需要返回子数组的具体位置. (3)数组的元素是整数,所以数组可能包含正整数,负整数或者零. 举几个例子: 数组:[1,-2,3,5,-3,2]返回8 数组:[0,-2,3,5,-1,2]返回9 数组:[-9,-2,-3,-5,-3]返回8 [解法一

最大连续子序列之和,最大连续子序列乘积

最大连续子序列之和问题描述为:数组中里有正数也有负数,连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值.分析,对数组a进行一遍扫描,sum[i] 为前i个元素中,包含第i个元素且和最大的连续子数组,MaxSum保存当前子数组中最大和,对于a[i+1]来说,sum[i+1] = sum[i]+a[i+1],此时如果sum[i+1]<0,那么sum需要重新赋0,从i+1之后开始累加,如果sum[i+1]>0,那么MaxSum = max(MaxSum, Sum[i

2.14 求数组的子数组之和的最大值

题目:给定一个一维数组,求这个数组的子数组之和的最大值. 最佳方法:动态规划! 一. 可以将一个大问题(N个元素数组)转化为一个较小的问题(N-1个元素数组).. 假设已经知道(A[1],...A[n-1])中最大的子数组的和为:All[1] 并且已经知道(A[1],...A[n-1])中包括A[1]的子数组的最大和为start[1] 所以最终的解All[0] = max(A[0], A[0]+start[1], All[1]) 所以通过DP来求解! 代码如下: #include <iostre

[编程之美] 2.14 求数组的子数组之和的最大值

问题描述:给定一个包含N个整数的数组,求数组的子数组之和的最大值. 这是递归和贪心策略的一个经典问题.现在,对这个问题进行一下总结. 1 明确题意 题目中的子数组要求是连续的,也就是数组中的某个连续部分. 如果数组中都是正整数,直接相加就行.因此,主要是要考虑负数的情况. 2 直接求所有的子数组和 最简单且容易理解的解法是求出所有的子数组和,然后保存最大的和. int MaxSum(int *A, int n) { int maximum = -INF; int sum = 0; int i =

hdu1003 Max Sum【最大连续子序列之和】

题目链接:https://vjudge.net/problem/HDU-1003 题目大意:给出一段序列,求出最大连续子序列之和,以及给出这段子序列的起点和终点. 解题思路:最长连续子序列之和问题其实有很多种求解方式,这里是用时间复杂度为O(n)的动态规划来求解. 思路很清晰,用dp数组来表示前i项的最大连续子序列之和,如果dp[i-1]>=0的话,则dp[i]加上dp[i-1]能够使dp[i]增大:若dp[i-1]<0的话,则重新以dp[i]为起点,起点更新. #include <cs

《github一天一道算法题》:分治法求数组最大连续子序列和

看书.思考.写代码! /*************************************** * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:分治法求数组最大连续子序列和 * 思路:分解成子问题+合并答案 * 时间复杂度:O(n lgn) * 空间复杂度:O(1) ***************************************/ #include <iostream> using nam

使用分治法求最大子序列之和

对于求最大子序列之和,对于我这样的菜鸟,首先想到的应该是最暴力的方法,就是将所有的子序列的和进行比较,然后出现最大值并返回答案.不过这也没啥意思,复杂度O(N2). 对这个问题,有一个相对复杂的O(NlogN)的解法,就是使用递归.其主要思想是:比较左.右.中间三部分的序列和的大小,因为中间部分是没办法分治的,只能在每一层递归函数空间里面进行,所以递归的部分为左.右,而且左右部分序列和有分别为次层递归的结果.递归的基本边界:左右为相同位置元素,即只有一个元素. 1 private static

编程之美2.14 求数组的子数组之和的最大值

问题描述: 一个有N个整数元素的一维数组(A[0], A[1], A[2],...,A[n-1]),这个数组当然有很多子数组,那么子数组之和的最大值是什么呢? 解法: 1. 暴力解法-------O(N^3) 2. 改进版暴力解法-------O(N^2) *3. 分治算法-------O(NlogN)(暂时未去实现) 4. 数组间关系法-------O(N) 具体思路和代码: 1.暴力解法 思路:Sum[i,...,j]为数组第i个元素到第j个元素的和,遍历所有可能的Sum[i,...,j].