Почему мой алгоритм поиска общего количества уникальных целых чисел в подмассиве (непрерывном) не работает для больших количеств целых и подмассивов?

Мой алгоритм поиска максимального числа уникальных целых чисел среди всех возможных смежных подмассивов не работает для больших количеств целых чисел и подмассивов. Например, я должен прочитать общее количество 6 целых чисел с консоли, и каждый подмассив имеет размер 3. Итак, для такого вида ввода 5 3 5 2 3 2 моя программа должна напечатать 3, и это работает нормально. В первом подмассиве хранится 5 3 5, поэтому число уникальных целых чисел равно 2. Во втором подмассиве хранится 3 5 2, поэтому число уникальных целых чисел равно 3. Третий подмассив также напечатал бы 3, потому что он хранит 5 2 3 и так далее...

Но, похоже, мой алгоритм не может обработать общее количество 100000 целых чисел с размером подмассива 99877. Может кто-нибудь объяснить мне, что я сделал не так?
К вашему сведению: я должен использовать реализацию Deque, такую ​​как LinkedList или ArrayDeque

for (int i = 0; i < totalAmountOfIntegers; i++) {

    int anyIntegerNumber = consoleInput.nextInt();
    arrayDequeToStoreAllIntegers.addLast(anyIntegerNumber);
    hashSetToStoreUniqueIntegers.add(anyIntegerNumber);

    if (arrayDequeToStoreAllIntegers.size() == sizeOfEachArrayDequeAsSubArray) {

        if (hashSetToStoreUniqueIntegers.size() > quantityOfUniqueIntegersInSubarray) {
            quantityOfUniqueIntegersInSubarray = hashSetToStoreUniqueIntegers.size();
        }

        int firstNumberInDeque = arrayDequeToStoreAllIntegers.remove();
        if (hashSetToStoreUniqueIntegers.size() == sizeOfEachArrayDequeAsSubArray) {
            hashSetToStoreUniqueIntegers.remove(firstNumberInDeque);
        }


    }
}

3 ответа

После дня исследований я нашел свою ошибку. Мое третье заявление IF неверно. Я сравниваю, если размер моей переменной HashSet равен максимальному размеру элементов, который может содержать каждый подмассив.
Вместо этого я должен сравнить, если моя переменная int firstNumberInDeque, которую я сначала удаляю из моей переменной ArrayDeque, содержит другую переменную int с тем же значением. Так что, если это правда, моя переменная HashSet остается неизменной.
Но, если моя переменная ArrayDeque не содержит другого int с тем же значением firstNumberInDeque, чем firstNumberInDeque, следует удалить из моей переменной HashSet. Вот правильный код:

int firstNumberInDeque = arrayDequeToStoreAllIntegers.remove();
if (!arrayDequeToStoreAllIntegers.contains(firstNumberInDeque)) {
    hashSetToStoreUniqueIntegers.remove(firstNumberInDeque);
}

Ответом будут просто уникальные целые числа во всем массиве, так как массив является надмножеством всех подмассивов, в нем будут присутствовать все числа
Просто найдите, сколько существует уникальных элементов

Если честно, я не понимаю ваш алгоритм. Я не совсем понимаю, на что ссылаются переменные (хотя, кажется, они названы семантически).
Но как насчет этого:

import java.util.HashSet;
import java.util.Set;

public class UniqueIntegers {

    public static void main(String[] args) {
        UniqueIntegers ui = new UniqueIntegers();

        Integer[][] integers = {
                {3,5,3,4,6},
                {1,6,3,2,4},
                {2,3,4},
                {3,3,6,9,2}
        };

        Set<Integer> unique = ui.uniqueIntegers(integers);

        System.out.println("Unique Integers: " + unique.size());
        System.out.println("Integers: " + unique);
    }


    private Set<Integer> uniqueIntegers(Integer[][] ints){
        Set<Integer> result = new HashSet<Integer>();

        for (Integer[] iSub : ints){
            for (Integer i : iSub){
                result.add(i);
            }
        }

        return result;
    }

}

Это печатает:

Unique Integers: 7
Integers: [1, 2, 3, 4, 5, 6, 9]
Другие вопросы по тегам