Числа, которые составляют Максимальную сумму - PullRequest
3 голосов
/ 20 мая 2019

Я только что написал свою программу, которая находит максимальную сумму из массива, но я застрял в том, есть ли способ, с помощью которого я могу найти, какие числа способствовали максимальной сумме?

ПравилоМаксимальная сумма указана: никакие соседние элементы не должны вносить вклад в сумму.

Мое решение для максимальной суммы в массиве:

public class MaximumELementInARray {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        String[] al = reader.nextLine().split(" ");
        int[] input = Arrays.stream(al).mapToInt(Integer::parseInt).toArray();
        MaximumELementInARray mm = new MaximumELementInARray();
        int maxi = mm.maximumm(input);
        System.out.println(maxi);
    }

    public int maximumm(int[] a) {
        List<Integer> ex = new ArrayList<>();
        List<Integer> inc = new ArrayList<>();
        int incl = a[0];
        int excl = 0;
        int excl_new;
        for (int i = 1; i < a.length; i++) {
            excl_new = Math.max(incl, excl);
            incl = excl + a[i];
            excl = excl_new;
        }
        System.out.println(incl > excl ? inc : ex);
        return incl > excl ? incl : excl;
    }
}

Теперь в функции maximum есть настройкакуда я могу поместить все индексы элементов, составляющих максимальную сумму?

Ввод:

-1 7 8 -5 4 9 -2 3

Вывод:

20

**

Мне нужно, как было 20 прибыл.Ответ должен сказать: 8+9+3

**

Я считаю, что в максимальной функции мы могли бы поместить Arraylist и записать, какие элементы вносят вклад в сумму, но я не могу реализовать.

Я сделал два Arraylist:

List<Integer> ex = new ArrayList<>();
List<Integer> inc = new ArrayList<>();

Ввод: -1 7 8 -5 4 Выход: 12 Сумма состоит из 8 + 4


Ввод: 3 2 1 -1 Выход: 4 Сумма состоит из 3 + 1

и т. Д. *

1 Ответ

3 голосов
/ 20 мая 2019

Вы можете следовать этому коду.

    int toIndex = 3, fromIndex = 0;
    List<Integer> result = new ArrayList<>();
    while (toIndex < numbers.size()) {
        Map<Integer, Integer> map = IntStream
                .range(fromIndex, toIndex)
                .filter(i->numbers.get(i)>0)
                .mapToObj(i -> new AbstractMap.SimpleEntry<>(i, numbers.get(i)))
                .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey,(a,b)->b));
        // find max of sublist
        int maxOfSub = numbers.subList(fromIndex, toIndex).stream().max(Integer::compareTo).get();
        //update indexes
        fromIndex = map.getOrDefault(maxOfSub,toIndex-1) + 2;
        toIndex += fromIndex;

        if (maxOfSub > 0)
            result.add(maxOfSub);
    }
    int lastMax = numbers.subList(fromIndex, numbers.size()).stream().max(Integer::compareTo).get();
    if (lastMax > 0)
        result.add(lastMax);
    System.out.println(result);
    System.out.println(result.stream().reduce(0, Integer::sum));

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...