kadane алгоритм в Java

у меня есть следующая реализация алгоритма Кадане в java. Это в основном, чтобы найти максимальную сумму смежного подмножества.

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 ответов


реализация алгоритма выглядит нормально, но ваш цикл условный i < numbers.length-1 нет: он останавливается всего за 1 до конца массива. i < numbers.length должны сделать это :-)


это работает для меня:

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

по поводу ответа выше Михала Šrajer:

строка #7: max_ending_here = математика.max (0, max_ending_here + x);

должно быть:

max_ending_here = математика.max (x, max_ending_here + x);

...согласно алгоритму Кадане, как определено здесь


слишком поздно, но если кому-то это нужно в будущем.

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);
    }