连续字数组的最大和

原创 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;

    }
}

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

相关文章推荐

【算法拾遗】三种方法求连续子数组的最大和

这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典。 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素...

连续字数组的最大和

package java_study.JianZhiOffer; import org.junit.Test; /** * Created by ethan on 2015/6/29. */ ...

31 - 连续字数组的最大和

题目要求: 输入一个整型数组,有正数也有负数。数组中一个或连续的多个整数组成一个字数组。求所有子数组和的最大值。要求时间复杂度O(n).leetcode | Maximum Subarray 最大连...

最大连续子序列和

  • 2014年09月16日 21:25
  • 45KB
  • 下载

EditText的清空 查看密码 限制输入空格 最大字数

总结了一下项目的时候用到EditText的时候经常需要用到的一些功能 EditText的清空  查看密码   限制输入空格 最大字数 上面功能我全部使用的是自定义EditText来实现,这样使用也比较...

三种方法实现最大连续子序列

  • 2012年09月19日 08:02
  • 2KB
  • 下载

求连续的最大和,最小和

  • 2013年07月21日 14:01
  • 1KB
  • 下载

Android学习之自定义TextWatcher来监听文本最大输入字数

开发中有种很可能会遇到的需求就是限制EditText的文本输入字数,例如微博就限制140字,如果只是限制输入的字数的话很简单,EditText有个属性叫android:maxLength,设置140就...

求一段连续数的最大和

  • 2013年03月24日 13:43
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:连续字数组的最大和
举报原因:
原因补充:

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