关闭

连续字数组的最大和

标签: 连续字数组的最大和 java 算法
165人阅读 评论(0) 收藏 举报
分类:

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

用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;

    }
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:42519次
    • 积分:1068
    • 等级:
    • 排名:千里之外
    • 原创:70篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条