У меня есть код который находит подпоследовательность с макс суммой, но самую длинную,
мне еще нужно самую короткую(имеется ввиду что короткая и длинная не выводится в одном коде, это будут 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Прошу прощения что так заполнил список