java中的kadane算法

时间:2011-08-29 16:36:21

标签: java algorithm dynamic-programming kadanes-algorithm

我在Java中有以下Kadane算法的实现。它基本上是找到连续子阵列的最大总和。

String[] numbers = string.split(",");
                int max_so_far = 0;
                int max_ending_here = 0;
                for (int i = 0; i < numbers.length-1;i++){
                     max_ending_here = max_ending_here + Integer.parseInt(numbers[i]);
                     if (max_ending_here < 0)
                         max_ending_here = 0;
                     if (max_so_far < max_ending_here)
                          max_so_far = max_ending_here;
                }
                System.out.println(max_so_far);

但是,如果数组中存在负数和正数的组合,则不起作用,例如:

2,3,-2,-1,10

哪个应该返回12作为最大值。截至目前,它返回5

4 个答案:

答案 0 :(得分:12)

你的算法实现看起来没问题,但你的循环条件i < numbers.length-1没有:它只停止数组末尾的1个。 i < numbers.length应该这样做: - )

答案 1 :(得分:4)

这对我有用:

    String string = "2,3,-2,-1,10";
    String[] numbers = string.split(",");
    int max_so_far = 0;
    int max_ending_here = 0;
    for (String num : numbers) {
        int x = Integer.parseInt(num);
        max_ending_here = Math.max(0, max_ending_here + x);
        max_so_far = Math.max(max_so_far, max_ending_here);
    }
    System.out.println(max_so_far);

答案 2 :(得分:2)

关于MichałŠrajer的上述答案:

第7行:max_ending_here = Math.max(0,max_ending_here + x);

应该是:

max_ending_here = Math.max(x,max_ending_here + x);

...根据定义的Kadane算法here

答案 3 :(得分:0)

太晚了,但如果有人将来需要它。

public static void kadaneAlgo(int[][] array)
    for(int i = 1; i < array.length; i++){
            int max_value_index_i = numberOrSum(array[i], past);
            if(max_value_index_i > sum){
                sum = max_value_index_i;
            }
            past = max_value_index_i;

        }
        System.out.println("Max sum from a contiguous sub array is : " + sum);
    }

    public static int numberOrSum(int number, int past){
        return Math.max(number, number+past);
    }