@vega2475

Как найти подпоследовательность непрерывных чисел сумма которых максимальна?

У меня есть код который находит подпоследовательность с макс суммой, но самую длинную, мне еще нужно самую короткую(имеется ввиду что короткая и длинная не выводится в одном коде, это будут 2 разных кода)

код
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(-5);
        list.add(6);
        list.add(-3);
        list.add(-13434);
        list.add(99);//6
        list.add(90);
        list.add(8);
        list.add(1);//9
        list.add(-9999);
        list.add(99);
        list.add(99);
        list.add(-444);
        list.add(-7444);
        list.add(100);
        list.add(90);
        list.add(8);
        if (list == null || list.size() == 0) {//проверка на пустоту листа
            System.out.println("empty array");
            return;
        }

        int maxSumStartIndex = 0;
        int maxSumLastIndex = 0;
        int maxSum = list.get(0);

        int lastSumStartIndex = 0;
        int lastSum = list.get(0);

        for (int i = 1; i < list.size(); i++) {

            lastSum += list.get(i);
            if (lastSum < list.get(i)) {
                lastSum = list.get(i);
                lastSumStartIndex = i;
            }
            int maxSumLength = i - maxSumStartIndex;
//            i - lastSumStartIndex
            if (maxSum < lastSum ) {
                maxSumStartIndex = lastSumStartIndex;
                maxSumLastIndex = i;
                maxSum = lastSum;
            }
            if (maxSum == lastSum) {
                if (!(i - lastSumStartIndex + 1 > i - maxSumStartIndex)) continue;
                maxSumStartIndex = lastSumStartIndex;
                maxSumLastIndex = i;
                maxSumLength = maxSumLastIndex - maxSumStartIndex + 1;
            }
        }

        System.out.println("sum( arr[" + maxSumStartIndex + "] .. arr[" + maxSumLastIndex + "] ) = " + maxSum);
        for (int i = maxSumStartIndex; i <= maxSumLastIndex; i++) {
            System.out.print(list.get(i) + " ");
        }
    }


}


За нахождение максимально длинной отвечает этот фрагмент:
f (maxSum == lastSum) {
                if (!(i - lastSumStartIndex + 1 > i - maxSumStartIndex)) continue;
                maxSumStartIndex = lastSumStartIndex;
                maxSumLastIndex = i;
                maxSumLength = maxSumLastIndex - maxSumStartIndex + 1;
            }


Вывод должен быть: 99 99 (с максимальной суммой и самая короткая).

Реализация обязательно в листах

spoiler
Прошу прощения что так заполнил список
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
@vega2475 Автор вопроса
if (maxSum == lastSum) {
                if (maxSumLastIndex - maxSumStartIndex < i - lastSumStartIndex) continue;
                maxSumStartIndex = lastSumStartIndex;//крч надо чтобы тут 11
                maxSumLastIndex = i;// а тут 12
                maxSumLength = maxSumLastIndex - maxSumStartIndex + 1;
            }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы