连续字数组的最大和

原创 2015年11月18日 22:08:17

题目:输入一个整形数组,数组中有正有负,数组中一个或连续多个整数组成一个字数组。求所有子数组的和的最大值。

用f(i)表示以第i个数为结尾的子数组的和的最大值,则有

则当i = 0 或者 f(i - 1) < 0时,f(i) = data[i];

否则f(i) = f(i - 1) + data[i]。

所以所有子数组的和的最大值=max [ f(i)] , i = 0,1....n-1。

这是递归实现,可以改递归实现为非递归实现。

java代码如下:

package AlgorithmTest;

/**
 * Created by dell on 2015/11/18.
 */
public class GreatestSumOfSubArray {
    public static void main(String[] args) {
        int[] array = new int[]{1, -2, 3, 10, -4, 7, 2, -5};
        try{
            System.out.println(findGreatestSumOfSubArray(array));
        }catch (Exception e){
            System.out.println("input error");
        }

        try{
            System.out.println(findGreatestSumOfSubArrayNotCursion(array));
        }catch (Exception e){
            System.out.println("input error");
        }
    }

    public static int findGreatestSumOfSubArray(int[] array) throws Exception{
        if (null == array || array.length == 0){
            throw new Exception();
        }

        int greatestSum = 0x80000000;

        for (int i = 0; i < array.length; ++i){
            int sum = 0;
            if ((sum = f(i, array)) > greatestSum){
                greatestSum = sum;
            }
        }
        return greatestSum;
    }

    public static int f(int i, int[] array){
        if (0 == i || f(i - 1, array) < 0)
            return array[i];
        else {
            return f(i - 1, array) + array[i];
        }
    }

    public static int findGreatestSumOfSubArrayNotCursion(int[] array) throws Exception{
        if (null == array || array.length == 0){
            throw new Exception();
        }

        int currSum = 0;
        int greatestSum = 0x80000000;

        for (int i = 0; i < array.length - 1; ++i){
            if (0 == i || currSum < 0){
                currSum = array[i];
            }else{
                currSum = currSum + array[i];
            }

            if (currSum > greatestSum){
               greatestSum = currSum;
            }

        }
        return greatestSum;

    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode-连续子数组的最大和

Find the contiguous subarray within an array (containing at least one number) which has the largest ...
  • ivolcano
  • ivolcano
  • 2017年03月10日 14:41
  • 1193

连续子数组的最大和 动态规划实现

/* *copyright@nciaebupt 转载请注明出处 *问题:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。 *求所有子数组的和的最大值。要求时间负责度为...
  • wuwuwuwuwuwuwuwu
  • wuwuwuwuwuwuwuwu
  • 2013年01月08日 16:51
  • 2570

Java编程----连续子数组的最大和

本篇博客的编程是关于数组的,数组在编程中有着举足轻重的地位,因为在Java中数组是直接存储在栈中的,所以操作起来很方便,效率非常高,数组也是面试中经常考察的一部分,关于数组的编程题目丰富多样,逻辑性很...
  • sd_lucky
  • sd_lucky
  • 2016年08月04日 23:09
  • 2553

[LeetCode] Maximum Subarray 求连续子数组的最大和

声明:原题目转载自LeetCode,解答部分为原创 Problem :     Find the contiguous subarray within an array (co...
  • xblog_
  • xblog_
  • 2017年06月05日 21:52
  • 290

连续子数组的最大和问题(一维和二维)To the Max (POJ 1050)

一维数组的连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 这是一个典型的D...
  • huanyingtianhe
  • huanyingtianhe
  • 2015年01月25日 16:35
  • 1175

剑指offer之连续子数组的最大和(Python)

输入一个整形数组,有正数和负数,数组中的一个或连续多个整数组成一个子数组,O(n)时间求所有子数组的和的最大值...
  • u010636181
  • u010636181
  • 2017年11月02日 11:17
  • 182

连续子数组的最大和 java实现

题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如...
  • qq_23217629
  • qq_23217629
  • 2016年09月11日 20:25
  • 877

【面试题之算法部分】最大和连续子数组

问题描述:给定一个数组A[0,1…n-1],求A的连续子数组,使该数组和最大 一. 暴力法 分析:首先初始化要求的最大值maxSum为A[0],然后定义三个索引i、j、k,然后三层循环:第一层i从0...
  • YoungLeoo
  • YoungLeoo
  • 2015年08月16日 08:29
  • 4463

java 求连续子数组的最大和

题目:输入一个整型数组,里面有正数也有负数,数组中一个或连续多个整数组成一个子数组,求所有子数组和的最大值。要求时间复杂度为O(n)解题思路:从头到尾遍历整个数组,用一个整数记录子数组和的最大值,如果...
  • diu_brother
  • diu_brother
  • 2016年03月25日 10:49
  • 661

动态规划典型例题--连续子数组的最大和

题目描述:给定一个数组arr,数组中的元素有整数也有负数,数组中的一个或者连续多个数组成一个子数组。 求所有子数组里面的最大和。例如现在有数组 {1 , -2 , 3 , 10 , -4 , 7...
  • qq_34528297
  • qq_34528297
  • 2017年05月24日 19:27
  • 406
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:连续字数组的最大和
举报原因:
原因补充:

(最多只允许输入30个字)